Create Payment
Charges a buyer for a plan. Pass a payment method already on file (member_id and payment_method_id), or a confirmation_token describing a method the buyer just supplied. Collection runs in the background: the response is the payment as created, not its outcome — poll Retrieve status for how far it has got and, for a confirmation-token payment, what the buyer must still do. plan_id names the plan to charge for.
Authorizations
An Account API key, account-scoped JWT, App API key, or user OAuth token. Prepend the key or token with Bearer, for example Bearer ***************************.
Headers
A unique key that makes this request safe to retry. See Idempotent requests.
255"d9105228-4a08-46b1-8b91-42fed586d383"
Pins the request to a dated API version.
"2026-09-02-1"
Body
The account to charge for, prefixed biz_.
"biz_xxxxxxxxxxxxxx"
The plan to charge for, prefixed plan_. It must belong to the account.
"plan_xxxxxxxxxxxxxx"
Whether to capture a card payment immediately. Defaults to true. Pass false to place an authorization hold that must be captured in full within five days via the capture endpoint.
false
A confirmation token describing a payment method the buyer just supplied. Provide this instead of member_id and payment_method_id; the buyer is resolved from the token's billing email, or from email. The buyer may still have a step to complete — poll the payment's status for what to do next.
"ctok_xxxxxxxxxxxxxx"
Overrides the buyer email carried on the confirmation token, resolving or creating the user the payment belongs to. Ignored unless confirmation_token is provided, and when the token was created by a signed-in buyer.
"dana@shinetime.example"
The member to charge, prefixed mber_. Required with payment_method_id unless confirmation_token is provided.
"mber_xxxxxxxxxxxxxx"
Custom metadata to attach to the payment.
The stored payment method to charge, prefixed payt_. It must belong to the member. Required unless confirmation_token is provided.
"payt_xxxxxxxxxxxxxx"
An active promo code to apply, prefixed promo_. It must belong to the account and be valid for the plan.
"promo_xxxxxxxxxxxxxx"
Where the buyer continues after completing an off-site step. An absolute https URL without credentials, at most 2,048 characters. Ignored unless confirmation_token is provided.
"https://shinetime.example/checkout/done"
Response
payment created from a stored payment method
The account that received the payment, prefixed biz_.
"biz_xxxxxxxxxxxxxx"
What the account keeps: the total less Whop's fees.
True when Whop refunded the payment automatically, for example on a dispute alert.
false
The billing address the buyer entered, or null.
Why the charge was created: a first purchase, a renewal, a one-time payment, or a manual charge.
subscription_create, subscription_cycle, subscription_update, one_time, manual, subscription "subscription_create"
The checkout configuration the buyer paid through, prefixed ch_, or null.
The credential a buyer's surface presents to poll this payment and set its return URL. Only on payments created from a confirmation token, and always null in list responses — retrieve the payment for it.
"pay_xxxxxxxxxxxxxx_secret_vdefault_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
When the payment was created, as an ISO 8601 timestamp.
"2026-01-01T12:00:00.000Z"
The currency the payment settles in, lowercase ISO 4217. Every money field below is stated in it unless it says otherwise.
usd, sgd, inr, aud, brl, cad, dkk, eur, nok, gbp, sek, chf, hkd, huf, jpy, mxn, myr, pln, czk, nzd, aed, eth, ape, cop, ron, thb, bgn, idr, dop, php, try, krw, twd, vnd, pkr, clp, uyu, ars, zar, dzd, tnd, mad, kes, kwd, jod, all, xcd, amd, bsd, bhd, bob, bam, khr, crc, xof, egp, etb, gmd, ghs, gtq, gyd, ils, jmd, mop, mga, mur, mdl, mnt, nad, ngn, mkd, omr, pyg, pen, qar, rwf, sar, rsd, lkr, tzs, ttd, uzs, rub, btc, cny, usdt, kzt, awg, whop_usd, xau "usd"
The phone number the buyer gave at checkout, when one was collected.
"+xxxxxxxxxxx"
The normalized decline reason of the most recent failed attempt, or null.
insufficient_funds, lost_card, stolen_card, expired_card, suspected_fraud, invalid_card_number, invalid_cvc, invalid_cvc_or_expiration, incorrect_pin, authentication_required, card_not_supported, currency_not_supported, duplicate_transaction, generic_decline, invalid_account, invalid_amount, processing_error, restricted_card, card_velocity_exceeded, contact_issuer, bank_declined, regulatory_blocked, transaction_not_permitted, transaction_stopped, card_type_not_supported, issuer_not_found, closed_account, issuer_unavailable, invalid_zip, invalid_expiry_month, invalid_expiry_year, invalid_expiry, invalid_transaction, cannot_authorize, pin_required, pin_try_exceeded, provider_declined, high_risk, test_mode_decline, merchant_blacklist, reenter_transaction, invalid_pin, pin_required_as, withdrawal_count_limit_exceeded, invalid_country, issuer_error, invalid_card_holder_name, no_accounts, transaction_cancelled, three_d_secure_success, three_d_secure_canceled, three_d_secure_invalid_card_number, three_d_secure_generic_error, three_d_secure_timeout, three_d_secure_failed, three_d_secure_card_not_enrolled, three_d_secure_fraud, three_d_secure_too_many_attempts, three_d_secure_rejected_by_bank, three_d_secure_reported_lost_or_stolen, blocked_by_cardholder, test_mode_test_card, try_again_later, transaction_not_allowed, bank_insufficient_funds, bank_account_not_found, bank_account_closed, bank_account_frozen, bank_invalid_routing_number, bank_non_transaction_account, bank_authorization_revoked, bank_payment_stopped, bank_not_authorized, bank_account_holder_deceased, bank_duplicate, bank_amount_error, bank_regulatory_blocked, bank_details_invalid, bank_processing_error, bank_generic_decline, sepa_invalid_iban, sepa_no_mandate, sepa_mandate_data_invalid, sepa_disputed, sepa_refused_by_customer, sepa_generic_decline "insufficient_funds"
When an issuer warned that this payment will be disputed, or null.
Why the most recent attempt failed, in plain words, or null.
For installment methods, how many payments the charge splits into.
Payment ID, prefixed pay_.
"pay_xxxxxxxxxxxxxx"
When the most recent charge attempt ran, or null.
The buyer's member record on the account, prefixed mber_. Null without the member:basic:read permission.
"mber_xxxxxxxxxxxxxx"
The membership this payment is billed against, prefixed mem_. Null for one-off purchases or without the member:basic:read permission.
"mem_xxxxxxxxxxxxxx"
Your own key-value data attached when the payment was created.
True when funds are held until the order ships and no tracking number has been added yet. Null without the shipment:basic:read permission.
false
When the next automatic retry is scheduled, or null.
When the money was collected, or null while it has not been.
"2026-01-01T12:00:00.000Z"
The instrument shaped for display: a buyer-facing name, the standard icon set, and the card's brand and last four when it was a card.
The stored payment method that was charged, prefixed payt_. Null when the method was not saved.
"payt_xxxxxxxxxxxxxx"
The kind of instrument used, for example card, apple_pay, klarna, or us_bank_account.
acss_debit, addi, affirm, afterpay_clearpay, alipay, alma, amazon_pay, apple, apple_pay, au_bank_transfer, au_becs_debit, bacs_debit, bancolombia, bancontact, bank_wire, billie, bizum, blik, boleto, bre_b, ca_bank_transfer, capchase_pay, card, card_installments_three, card_installments_six, card_installments_twelve, cashapp, claritypay, coinbase, crypto, custom, customer_balance, demo_pay, efecty, eps, eu_bank_transfer, fpx, flex_pay, gb_bank_transfer, gcash, giropay, google_pay, gopay, grabpay, id_bank_transfer, ideal, interac, kakao_pay, klarna, klarna_pay_now, konbini, kr_card, kr_market, kriya, kueski, link, mb_way, m_pesa, mercado_pago, mobilepay, modo, mondu, multibanco, naver_pay, nequi, netbanking, ng_bank, ng_bank_transfer, ng_card, ng_market, ng_ussd, ng_wallet, nz_bank_account, oxxo, p24, pago_efectivo, pse, pay_by_bank, payco, paynow, paypal, paypay, payto, 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, tamara, twint, upi, us_bank_account, us_bank_transfer, venmo, vipps, webpay, wechat_pay, yape, zip, coinflow, unknown "acss_debit"
How many charge attempts have failed on this payment.
0
The plan that was charged, prefixed plan_.
"plan_xxxxxxxxxxxxxx"
The product the plan belongs to, prefixed prod_. Null for a plan with no product.
"prod_xxxxxxxxxxxxxx"
The promo code applied at checkout, prefixed promo_, or null.
True when the payment is paid, not yet fully refunded, and its processor supports refunds.
false
How much has been refunded so far, as it settled — refunds convert at the rate in force when each one was issued, not the payment's original rate.
When the payment was refunded, or null.
True when the payment is open and Whop can attempt the charge again — see POST /payments/{id}/retry.
true
Whop's fraud risk score from 0 (lowest) to 100 (highest), or null when the payment was not scored.
The factors behind risk_score, grouped by category, or null.
When the funds post to the account's available balance, at midnight UTC. The ledger_account.funds_available webhook carries the same value. Null until the payment is paid, and always null in list responses — retrieve the payment for it.
The shipment fulfilling this payment, prefixed ship_. Null when nothing ships or without the shipment:basic:read permission.
The shipping address for physical goods, or null.
The lifecycle state of the charge: open while collection is outstanding, paid once the money moved, pending while a settlement rail clears, void/uncollectible when it ended without collecting.
draft, open, authorized, paid, pending, uncollectible, unresolved, void "draft"
The dashboard's finer-grained reading of the payment, folding in refunds, disputes and Resolution Center cases.
succeeded, requires_capture, pending, failed, past_due, canceled, price_too_low, uncollectible, refunded, auto_refunded, partially_refunded, dispute_warning, dispute_needs_response, dispute_warning_needs_response, resolution_needs_response, dispute_under_review, dispute_warning_under_review, resolution_under_review, dispute_won, dispute_warning_closed, resolution_won, dispute_lost, dispute_closed, resolution_lost, drafted, incomplete, unresolved, open_dispute, open_resolution "succeeded"
The price before discounts, tax and fees.
The sales tax or VAT collected. Null when no tax applied.
Whether tax_amount was added on top of the price (exclusive) or was already inside it (inclusive).
exclusive, inclusive, unspecified, unable_to_collect "exclusive"
How much of the collected tax has been returned to the buyer so far. Zero when the payment carried no tax, or when nothing has been refunded.
True when the buyer completed 3D Secure for this payment.
false
The account-facing total: the price after discounts, plus any tax added on top. Excludes buyer fees, which the buyer pays above this amount — so this is not necessarily what the buyer's statement shows.
When the payment last changed, as an ISO 8601 timestamp.
"2026-01-01T12:00:00.000Z"
The total converted to USD at the time of the charge, for reporting across currencies. Excludes the adaptive pricing FX markup, which the account does not keep.
The buyer. Null when the payment belongs to a company buyer rather than a user.
The issuer's address and security code check results, or null when the processor returned none.
True when the payment is open on a past-due membership and its processor supports voiding — see POST /payments/{id}/void.
false

