Skip to main content
POST
Create Payment

Authorizations

Authorization
string
header
required

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

Idempotency-Key
string

A unique key that makes this request safe to retry. See Idempotent requests.

Maximum string length: 255
Example:

"d9105228-4a08-46b1-8b91-42fed586d383"

Api-Version-Date
string

Pins the request to a dated API version.

Example:

"2026-09-02-1"

Body

application/json
account_id
string
required

The account to charge for, prefixed biz_.

Example:

"biz_xxxxxxxxxxxxxx"

plan_id
string
required

The plan to charge for, prefixed plan_. It must belong to the account.

Example:

"plan_xxxxxxxxxxxxxx"

capture
boolean | null

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.

Example:

false

confirmation_token
string | null

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.

Example:

"ctok_xxxxxxxxxxxxxx"

email
string | null

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.

Example:

"dana@shinetime.example"

member_id
string | null

The member to charge, prefixed mber_. Required with payment_method_id unless confirmation_token is provided.

Example:

"mber_xxxxxxxxxxxxxx"

metadata
object | null

Custom metadata to attach to the payment.

Example:
payment_method_id
string | null

The stored payment method to charge, prefixed payt_. It must belong to the member. Required unless confirmation_token is provided.

Example:

"payt_xxxxxxxxxxxxxx"

promo_code_id
string | null

An active promo code to apply, prefixed promo_. It must belong to the account and be valid for the plan.

Example:

"promo_xxxxxxxxxxxxxx"

return_url
string | null

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.

Example:

"https://shinetime.example/checkout/done"

Response

payment created from a stored payment method

account_id
string | null
required

The account that received the payment, prefixed biz_.

Example:

"biz_xxxxxxxxxxxxxx"

amount_after_fees
object
required

What the account keeps: the total less Whop's fees.

auto_refunded
boolean
required

True when Whop refunded the payment automatically, for example on a dispute alert.

Example:

false

billing_address
object | null
required

The billing address the buyer entered, or null.

billing_reason
enum<string> | null
required

Why the charge was created: a first purchase, a renewal, a one-time payment, or a manual charge.

Available options:
subscription_create,
subscription_cycle,
subscription_update,
one_time,
manual,
subscription
Example:

"subscription_create"

checkout_configuration_id
string | null
required

The checkout configuration the buyer paid through, prefixed ch_, or null.

client_secret
string | null
required

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.

Example:

"pay_xxxxxxxxxxxxxx_secret_vdefault_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

created_at
string
required

When the payment was created, as an ISO 8601 timestamp.

Example:

"2026-01-01T12:00:00.000Z"

currency
enum<string>
required

The currency the payment settles in, lowercase ISO 4217. Every money field below is stated in it unless it says otherwise.

Available options:
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
Example:

"usd"

customer_phone
string | null
required

The phone number the buyer gave at checkout, when one was collected.

Example:

"+xxxxxxxxxxx"

decline_code
enum<string> | null
required

The normalized decline reason of the most recent failed attempt, or null.

Available options:
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
Example:

"insufficient_funds"

dispute_alerted_at
string | null
required

When an issuer warned that this payment will be disputed, or null.

failure_message
string | null
required

Why the most recent attempt failed, in plain words, or null.

financing_installments_count
number | null
required

For installment methods, how many payments the charge splits into.

id
string
required

Payment ID, prefixed pay_.

Example:

"pay_xxxxxxxxxxxxxx"

last_payment_attempt_at
string | null
required

When the most recent charge attempt ran, or null.

member_id
string | null
required

The buyer's member record on the account, prefixed mber_. Null without the member:basic:read permission.

Example:

"mber_xxxxxxxxxxxxxx"

membership_id
string | null
required

The membership this payment is billed against, prefixed mem_. Null for one-off purchases or without the member:basic:read permission.

Example:

"mem_xxxxxxxxxxxxxx"

metadata
object | null
required

Your own key-value data attached when the payment was created.

Example:
needs_tracking
boolean | null
required

True when funds are held until the order ships and no tracking number has been added yet. Null without the shipment:basic:read permission.

Example:

false

next_payment_attempt_at
string | null
required

When the next automatic retry is scheduled, or null.

paid_at
string | null
required

When the money was collected, or null while it has not been.

Example:

"2026-01-01T12:00:00.000Z"

payment_instrument
object | null
required

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.

payment_method_id
string | null
required

The stored payment method that was charged, prefixed payt_. Null when the method was not saved.

Example:

"payt_xxxxxxxxxxxxxx"

payment_method_type
enum<string> | null
required

The kind of instrument used, for example card, apple_pay, klarna, or us_bank_account.

Available options:
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
Example:

"acss_debit"

payments_failed
number
required

How many charge attempts have failed on this payment.

Example:

0

plan_id
string | null
required

The plan that was charged, prefixed plan_.

Example:

"plan_xxxxxxxxxxxxxx"

product_id
string | null
required

The product the plan belongs to, prefixed prod_. Null for a plan with no product.

Example:

"prod_xxxxxxxxxxxxxx"

promo_code_id
string | null
required

The promo code applied at checkout, prefixed promo_, or null.

refundable
boolean
required

True when the payment is paid, not yet fully refunded, and its processor supports refunds.

Example:

false

refunded_amount
object | null
required

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.

refunded_at
string | null
required

When the payment was refunded, or null.

retryable
boolean
required

True when the payment is open and Whop can attempt the charge again — see POST /payments/{id}/retry.

Example:

true

risk_score
number | null
required

Whop's fraud risk score from 0 (lowest) to 100 (highest), or null when the payment was not scored.

risk_signals
object | null
required

The factors behind risk_score, grouped by category, or null.

settlement_time_at
string | null
required

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.

shipment_id
string | null
required

The shipment fulfilling this payment, prefixed ship_. Null when nothing ships or without the shipment:basic:read permission.

shipping_address
object | null
required

The shipping address for physical goods, or null.

status
enum<string>
required

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.

Available options:
draft,
open,
authorized,
paid,
pending,
uncollectible,
unresolved,
void
Example:

"draft"

substatus
enum<string>
required

The dashboard's finer-grained reading of the payment, folding in refunds, disputes and Resolution Center cases.

Available options:
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
Example:

"succeeded"

subtotal
object | null
required

The price before discounts, tax and fees.

tax_amount
object | null
required

The sales tax or VAT collected. Null when no tax applied.

tax_behavior
enum<string> | null
required

Whether tax_amount was added on top of the price (exclusive) or was already inside it (inclusive).

Available options:
exclusive,
inclusive,
unspecified,
unable_to_collect
Example:

"exclusive"

tax_refunded_amount
object
required

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.

three_ds_verified
boolean
required

True when the buyer completed 3D Secure for this payment.

Example:

false

total
object | null
required

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.

updated_at
string
required

When the payment last changed, as an ISO 8601 timestamp.

Example:

"2026-01-01T12:00:00.000Z"

usd_total
object | null
required

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.

user
object | null
required

The buyer. Null when the payment belongs to a company buyer rather than a user.

verification_checks
object | null
required

The issuer's address and security code check results, or null when the processor returned none.

voidable
boolean
required

True when the payment is open on a past-due membership and its processor supports voiding — see POST /payments/{id}/void.

Example:

false