---
title: "Create payment"
method: POST
path: "/payments"
tags: ["Payments"]
---

# Create payment

`POST /payments`

Charge an existing member off-session using one of their stored payment methods. You can provide an existing plan, or create a new one in-line. This endpoint will respond with a payment object immediately, but the payment is processed asynchronously in the background. Use webhooks to be notified when the payment succeeds or fails.

Required permissions:
 - `payment:charge`
 - `plan:create`
 - `access_pass:create`
 - `access_pass:update`
 - `plan:basic:read`
 - `access_pass:basic:read`
 - `member:email:read`
 - `member:basic:read`
 - `member:phone:read`
 - `promo_code:basic:read`
 - `shipment:basic:read`
 - `payment:dispute:read`
 - `payment:resolution_center_case:read`

## Request body

- union — Parameters for CreatePayment
  - object — Autogenerated input type of CreatePayment
    - `company_id` string, required — The ID of the company to create the payment for.
    - `confirmation_token` string, required — A confirmation token ID (ctok_) describing a payment method the buyer just supplied. Provide this INSTEAD of member_id and payment_method_id to charge a method that is not yet on file — the buyer is resolved from the token's billing email, or from `email`. The buyer may still have a step to complete (3DS, a redirect, linking a bank); poll the payment's status endpoint for what to do next.
    - `email` string, nullable — Overrides the buyer email carried on the confirmation token, resolving or creating the Whop user the payment belongs to. Ignored when the confirmation token was created by a signed-in buyer, and unless confirmation_token is provided.
    - `metadata` object, nullable — Custom metadata to attach to the payment.
    - `payment_method_id` string, nullable — The ID of the payment method to use for the payment. It must be connected to the Member being charged. Required unless confirmation_token is provided.
    - `plan` object, required — Pass this object to create a new plan for this payment
      - `application_fee_amount` number, nullable — The application fee amount collected by the platform from this connected account. Provided as a number in dollars (e.g., 5.00 for $5.00). Must be less than the total payment amount. Only valid for connected accounts with a parent company.
      - `billing_period` integer, nullable — The interval in days at which the plan charges (renewal plans). For example, 30 for monthly billing.
      - `currency` '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', required — The available currencies on the platform
      - `description` string, nullable — The description of the plan.
      - `expiration_days` integer, nullable — The number of days until the membership expires and revokes access (expiration plans). For example, 365 for one year.
      - `force_create_new_plan` boolean, nullable — Whether to force the creation of a new plan even if one with the same attributes already exists.
      - `initial_price` number, nullable — An additional amount charged upon first purchase. Provided as a number in the specified currency. Eg: 10.43 for $10.43 USD.
      - `internal_notes` string, nullable — A personal description or notes section for the business.
      - `plan_type` 'renewal' | 'one_time' — The type of plan that can be attached to a product
      - `product` object, nullable — Pass this object to create a new product for this plan. We will use the product external identifier to find or create an existing product.
        - `collect_shipping_address` boolean, nullable — Whether or not to collect shipping information at checkout from the customer.
        - `custom_statement_descriptor` string, nullable — The custom statement descriptor for the product i.e. WHOP*SPORTS, must be between 5 and 22 characters, contain at least one letter, and not contain any of the following characters: <, >, \, ', "
        - `description` string, nullable — A written description of the product.
        - `external_identifier` string, required — A unique ID used to find or create a product. When provided during creation, we will look for an existing product with this external identifier — if found, it will be updated; otherwise, a new product will be created.
        - `global_affiliate_percentage` number, nullable — The percentage of the revenue that goes to the global affiliate program.
        - `global_affiliate_status` 'enabled' | 'disabled' — The different statuses of the global affiliate program for a product.
        - `headline` string, nullable — The headline of the product.
        - `product_tax_code_id` string, nullable — The ID of the product tax code to apply to this product.
        - `redirect_purchase_url` string, nullable — The URL to redirect the customer to after a purchase.
        - `route` string, nullable — The route of the product.
        - `title` string, required — The title of the product.
        - `visibility` 'visible' | 'hidden' | 'archived' | 'quick_link' — Visibility of a resource
      - `product_id` string, nullable — The product the plan is related to. Either this or product is required.
      - `renewal_price` number, nullable — The amount the customer is charged every billing period. Provided as a number in the specified currency. Eg: 10.43 for $10.43 USD.
      - `title` string, nullable — The title of the plan. This will be visible on the product page to customers.
      - `trial_period_days` integer, nullable — The number of free trial days added before a renewal plan.
      - `visibility` 'visible' | 'hidden' | 'archived' | 'quick_link' — Visibility of a resource
    - `promo_code_id` string, nullable — The ID of an active promo code to apply to this payment. The promo code must belong to the company and be valid for the plan being purchased. The plan must be attached to a product — promo codes are not eligible for one-off purchases.
    - `return_url` string, nullable — Where the buyer continues after completing an off-site step. Must be an absolute https URL without credentials, at most 2,048 characters. Editable until they return — see the payment's update endpoint. Ignored unless confirmation_token is provided.
  - object — Autogenerated input type of CreatePayment
    - `company_id` string, required — The ID of the company to create the payment for.
    - `email` string, nullable — Overrides the buyer email carried on the confirmation token, resolving or creating the Whop user the payment belongs to. Ignored when the confirmation token was created by a signed-in buyer, and unless confirmation_token is provided.
    - `member_id` string, required — The ID of the member to create the payment for. Required unless confirmation_token is provided.
    - `metadata` object, nullable — Custom metadata to attach to the payment.
    - `payment_method_id` string, nullable — The ID of the payment method to use for the payment. It must be connected to the Member being charged. Required unless confirmation_token is provided.
    - `plan` object, required — Pass this object to create a new plan for this payment
      - `application_fee_amount` number, nullable — The application fee amount collected by the platform from this connected account. Provided as a number in dollars (e.g., 5.00 for $5.00). Must be less than the total payment amount. Only valid for connected accounts with a parent company.
      - `billing_period` integer, nullable — The interval in days at which the plan charges (renewal plans). For example, 30 for monthly billing.
      - `currency` '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', required — The available currencies on the platform
      - `description` string, nullable — The description of the plan.
      - `expiration_days` integer, nullable — The number of days until the membership expires and revokes access (expiration plans). For example, 365 for one year.
      - `force_create_new_plan` boolean, nullable — Whether to force the creation of a new plan even if one with the same attributes already exists.
      - `initial_price` number, nullable — An additional amount charged upon first purchase. Provided as a number in the specified currency. Eg: 10.43 for $10.43 USD.
      - `internal_notes` string, nullable — A personal description or notes section for the business.
      - `plan_type` 'renewal' | 'one_time' — The type of plan that can be attached to a product
      - `product` object, nullable — Pass this object to create a new product for this plan. We will use the product external identifier to find or create an existing product.
        - `collect_shipping_address` boolean, nullable — Whether or not to collect shipping information at checkout from the customer.
        - `custom_statement_descriptor` string, nullable — The custom statement descriptor for the product i.e. WHOP*SPORTS, must be between 5 and 22 characters, contain at least one letter, and not contain any of the following characters: <, >, \, ', "
        - `description` string, nullable — A written description of the product.
        - `external_identifier` string, required — A unique ID used to find or create a product. When provided during creation, we will look for an existing product with this external identifier — if found, it will be updated; otherwise, a new product will be created.
        - `global_affiliate_percentage` number, nullable — The percentage of the revenue that goes to the global affiliate program.
        - `global_affiliate_status` 'enabled' | 'disabled' — The different statuses of the global affiliate program for a product.
        - `headline` string, nullable — The headline of the product.
        - `product_tax_code_id` string, nullable — The ID of the product tax code to apply to this product.
        - `redirect_purchase_url` string, nullable — The URL to redirect the customer to after a purchase.
        - `route` string, nullable — The route of the product.
        - `title` string, required — The title of the product.
        - `visibility` 'visible' | 'hidden' | 'archived' | 'quick_link' — Visibility of a resource
      - `product_id` string, nullable — The product the plan is related to. Either this or product is required.
      - `renewal_price` number, nullable — The amount the customer is charged every billing period. Provided as a number in the specified currency. Eg: 10.43 for $10.43 USD.
      - `title` string, nullable — The title of the plan. This will be visible on the product page to customers.
      - `trial_period_days` integer, nullable — The number of free trial days added before a renewal plan.
      - `visibility` 'visible' | 'hidden' | 'archived' | 'quick_link' — Visibility of a resource
    - `promo_code_id` string, nullable — The ID of an active promo code to apply to this payment. The promo code must belong to the company and be valid for the plan being purchased. The plan must be attached to a product — promo codes are not eligible for one-off purchases.
    - `return_url` string, nullable — Where the buyer continues after completing an off-site step. Must be an absolute https URL without credentials, at most 2,048 characters. Editable until they return — see the payment's update endpoint. Ignored unless confirmation_token is provided.
  - object — Autogenerated input type of CreatePayment
    - `company_id` string, required — The ID of the company to create the payment for.
    - `confirmation_token` string, required — A confirmation token ID (ctok_) describing a payment method the buyer just supplied. Provide this INSTEAD of member_id and payment_method_id to charge a method that is not yet on file — the buyer is resolved from the token's billing email, or from `email`. The buyer may still have a step to complete (3DS, a redirect, linking a bank); poll the payment's status endpoint for what to do next.
    - `email` string, nullable — Overrides the buyer email carried on the confirmation token, resolving or creating the Whop user the payment belongs to. Ignored when the confirmation token was created by a signed-in buyer, and unless confirmation_token is provided.
    - `metadata` object, nullable — Custom metadata to attach to the payment.
    - `payment_method_id` string, nullable — The ID of the payment method to use for the payment. It must be connected to the Member being charged. Required unless confirmation_token is provided.
    - `plan_id` string, required — An ID of an existing plan to use for the payment.
    - `promo_code_id` string, nullable — The ID of an active promo code to apply to this payment. The promo code must belong to the company and be valid for the plan being purchased. The plan must be attached to a product — promo codes are not eligible for one-off purchases.
    - `return_url` string, nullable — Where the buyer continues after completing an off-site step. Must be an absolute https URL without credentials, at most 2,048 characters. Editable until they return — see the payment's update endpoint. Ignored unless confirmation_token is provided.
  - object — Autogenerated input type of CreatePayment
    - `company_id` string, required — The ID of the company to create the payment for.
    - `email` string, nullable — Overrides the buyer email carried on the confirmation token, resolving or creating the Whop user the payment belongs to. Ignored when the confirmation token was created by a signed-in buyer, and unless confirmation_token is provided.
    - `member_id` string, required — The ID of the member to create the payment for. Required unless confirmation_token is provided.
    - `metadata` object, nullable — Custom metadata to attach to the payment.
    - `payment_method_id` string, nullable — The ID of the payment method to use for the payment. It must be connected to the Member being charged. Required unless confirmation_token is provided.
    - `plan_id` string, required — An ID of an existing plan to use for the payment.
    - `promo_code_id` string, nullable — The ID of an active promo code to apply to this payment. The promo code must belong to the company and be valid for the plan being purchased. The plan must be attached to a product — promo codes are not eligible for one-off purchases.
    - `return_url` string, nullable — Where the buyer continues after completing an off-site step. Must be an absolute https URL without credentials, at most 2,048 characters. Editable until they return — see the payment's update endpoint. Ignored unless confirmation_token is provided.

## Response `200`

A successful response

- Payment — A payment represents a completed or attempted charge. Payments track the amount, status, currency, and payment method used.
  - `amount_after_fees` number, required — How much the payment is for after fees
  - `application_fee` object, nullable, required — The application fee charged on this payment.
    - `amount` number, required — The application fee amount.
    - `amount_captured` number, required — The amount of the application fee that has been captured.
    - `amount_refunded` number, required — The amount of the application fee that has been refunded.
    - `created_at` string, date-time, required — The datetime the application fee was created.
    - `currency` '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', required — The available currencies on the platform
    - `id` string, required — The unique identifier for the application fee.
  - `auto_refunded` boolean, required — Whether this payment was auto refunded or not
  - `billing_address` object, nullable, required — The address of the user who made the payment.
    - `city` string, nullable, required — The city of the address.
    - `country` string, nullable, required — The country of the address.
    - `line1` string, nullable, required — The line 1 of the address.
    - `line2` string, nullable, required — The line 2 of the address.
    - `name` string, nullable, required — The name of the customer.
    - `postal_code` string, nullable, required — The postal code of the address.
    - `state` string, nullable, required — The state of the address.
  - `billing_reason` 'subscription_create' | 'subscription_cycle' | 'subscription_update' | 'one_time' | 'manual' | 'subscription', required — The reason why a specific payment was billed
  - `card_brand` 'mastercard' | 'visa' | 'amex' | 'discover' | 'unionpay' | 'jcb' | 'diners' | 'link' | 'troy' | 'visadankort' | 'visabancontact' | 'china_union_pay' | 'rupay' | 'jcbrupay' | 'elo' | 'maestro' | 'tarjeta_naranja' | 'cirrus' | 'nspk_mir' | 'verve' | 'ebt' | 'private_label' | 'local_brand' | 'uatp' | 'wexcard' | 'uzcard' | 'meeza' | 'hrg_store_card' | 'girocard' | 'fuel_card' | 'dankort' | 'carnet' | 'atm_card' | 'china_union_payuzcard' | 'codensa' | 'cabal' | 'hipercard' | 'jcblankapay' | 'cmi' | 'aura' | 'unknown', required — Possible card brands that a payment token can have
  - `card_exp_month` integer, nullable, required — The expiration month (1-12) of the card used for this payment. Falls back to the declined card on failed payments with no saved card. Null when the payment was not made with a card or the expiry is unavailable.
  - `card_exp_year` integer, nullable, required — The four-digit expiration year of the card used for this payment. Falls back to the declined card on failed payments with no saved card. Null when the payment was not made with a card or the expiry is unavailable.
  - `card_last4` string, nullable, required — The last four digits of the card used to make this payment. Null if the payment was not made with a card.
  - `checkout_configuration_id` string, nullable, required — The ID of the checkout session/configuration that produced this payment, if any. Use this to map payments back to the checkout configuration that created them.
  - `company` object, nullable, required — The company for the payment.
    - `id` string, required — The unique identifier for the company.
    - `route` string, required — The slug/route of the company on the Whop site.
    - `title` string, required — The written name of the company.
  - `created_at` string, date-time, required — The datetime the payment was created.
  - `currency` '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', required — The available currencies on the platform
  - `customer_phone` string, nullable, required — Phone number the customer provided at checkout, or their verified phone number when your checkout requires phone verification. `null` when no phone number was collected.
  - `decline_code` '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', required — The reason a payment was declined.
  - `dispute_alerted_at` string, date-time, nullable, required — When an alert came in that this transaction will be disputed
  - `disputes` object[], nullable, required — The disputes attached to this payment. Null if the actor in context does not have the payment:dispute:read permission.
    - `amount` number, required — The disputed amount in the specified currency, formatted as a decimal.
    - `currency` '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', required — The available currencies on the platform
    - `editable` boolean, nullable, required — Whether the dispute evidence can still be edited and submitted.
    - `id` string, required — The unique identifier for the dispute.
    - `needs_response_by` string, date-time, nullable, required — The deadline by which dispute evidence must be submitted. Null if no response deadline is set.
    - `notes` string, nullable, required — Additional freeform notes submitted by the company as part of the dispute evidence.
    - `reason` string, nullable, required — A human-readable reason for the dispute.
    - `status` 'warning_needs_response' | 'warning_under_review' | 'warning_closed' | 'needs_response' | 'under_review' | 'won' | 'lost' | 'closed' | 'other', required — The possible statuses of a dispute
  - `failure_message` string, nullable, required — If the payment failed, the reason for the failure.
  - `financing_installments_count` integer, nullable, required — The number of financing installments for the payment. Present if the payment is a financing payment (e.g. Splitit, Klarna, etc.).
  - `financing_transactions` object[], required — The financing transactions attached to this payment. Present if the payment is a financing payment (e.g. Splitit, Klarna, etc.).
    - `amount` number, required — The amount of the payment transaction.
    - `created_at` string, date-time, required — The date and time the payment transaction was created.
    - `id` string, required — The unique identifier for the payment transaction.
    - `status` 'succeeded' | 'declined' | 'error' | 'pending' | 'created' | 'expired' | 'won' | 'rejected' | 'lost' | 'prevented' | 'canceled', required — The different statuses a payment transaction can be in.
    - `transaction_type` 'purchase' | 'authorize' | 'capture' | 'refund' | 'canceled' | 'verify' | 'chargeback' | 'pre_chargeback' | 'three_d_secure' | 'fraud_screening' | 'authorization' | 'installment', required — The different types of payment transactions.
  - `id` string, required — The unique identifier for the payment.
  - `last_payment_attempt` string, date-time, nullable, required — The time of the last payment attempt.
  - `member` object, nullable, required — The member attached to this payment.
    - `id` string, required — The unique identifier for the company member.
    - `phone` string, nullable, required — The phone number for the member, if available.
  - `membership` object, nullable, required — The membership attached to this payment.
    - `id` string, required — The unique identifier for the membership.
    - `phone_number` string, nullable, required — The phone number associated with this membership.
    - `status` 'trialing' | 'active' | 'past_due' | 'completed' | 'canceled' | 'expired' | 'unresolved' | 'drafted' | 'canceling', required — The status of a membership
  - `metadata` object, nullable, required — The custom metadata stored on this payment. This will be copied over to the checkout configuration for which this payment was made
  - `needs_tracking` boolean, nullable, required — Whether this payment is holding funds until the order ships and has no tracking number yet.
  - `next_payment_attempt` string, date-time, nullable, required — The time of the next schedule payment retry.
  - `paid_at` string, date-time, nullable, required — The time at which this payment was successfully collected. Null if the payment has not yet succeeded. As a Unix timestamp.
  - `payment_method` object, nullable, required — The tokenized payment method reference used for this payment. Null if no token was used.
    - `card` object, nullable, required — The card data associated with the payment method, if its a debit or credit card.
      - `brand` 'mastercard' | 'visa' | 'amex' | 'discover' | 'unionpay' | 'jcb' | 'diners' | 'link' | 'troy' | 'visadankort' | 'visabancontact' | 'china_union_pay' | 'rupay' | 'jcbrupay' | 'elo' | 'maestro' | 'tarjeta_naranja' | 'cirrus' | 'nspk_mir' | 'verve' | 'ebt' | 'private_label' | 'local_brand' | 'uatp' | 'wexcard' | 'uzcard' | 'meeza' | 'hrg_store_card' | 'girocard' | 'fuel_card' | 'dankort' | 'carnet' | 'atm_card' | 'china_union_payuzcard' | 'codensa' | 'cabal' | 'hipercard' | 'jcblankapay' | 'cmi' | 'aura' | 'unknown', required — Possible card brands that a payment token can have
      - `exp_month` integer, nullable, required — The two-digit expiration month of the card (1-12). Null if not available.
      - `exp_year` integer, nullable, required — The two-digit expiration year of the card (e.g., 27 for 2027). Null if not available.
      - `last4` string, nullable, required — The last four digits of the card number. Null if not available.
    - `created_at` string, date-time, required — The datetime the payment token was created.
    - `id` string, required — The unique identifier for the payment token.
    - `payment_method_type` 'acss_debit' | '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' | 'gb_bank_transfer' | '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' | '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' | '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', required — The different types of payment methods that can be used.
  - `payment_method_type` 'acss_debit' | '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' | 'gb_bank_transfer' | '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' | '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' | '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', required — The different types of payment methods that can be used.
  - `payments_failed` integer, nullable, required — The number of failed payment attempts for the payment.
  - `plan` object, nullable, required — The plan attached to this payment.
    - `id` string, required — The unique identifier for the plan.
    - `internal_notes` string, nullable, required — A personal description or notes section for the business.
    - `metadata` object, nullable, required — Custom key-value pairs stored on the plan. Included in webhook payloads for payment and membership events. Max 50 keys, 100 chars per key, 500 chars per string value.
  - `product` object, nullable, required — The product this payment was made for
    - `id` string, required — The unique identifier for the product.
    - `metadata` object, nullable, required — Custom key-value pairs stored on the product and included in payment and membership webhook payloads. Max 50 keys, 100 characters per key, 500 characters per string value.
    - `route` string, required — URL slug in the product's public link, e.g. `pickaxe-analytics` in whop.com/company/pickaxe-analytics.
    - `title` string, required — The display name of the product shown to customers on the product page and in search results.
  - `promo_code` object, nullable, required — The promo code used for this payment.
    - `amount_off` number, required — The discount amount. Interpretation depends on promo_type: if 'percentage', this is the percentage (e.g., 20 means 20% off); if 'flat_amount', this is dollars off (e.g., 10.00 means $10.00 off).
    - `base_currency` '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', required — The available currencies on the platform
    - `code` string, nullable, required — The specific code used to apply the promo at checkout.
    - `id` string, required — The unique identifier for the promo code.
    - `number_of_intervals` integer, nullable, required — The number of months the promo is applied for.
    - `promo_type` 'percentage' | 'flat_amount', required — The type of promo code used to discount a plan
  - `refundable` boolean, required — True only for payments that are `paid`, have not been fully refunded, and were processed by a payment processor that allows refunds.
  - `refunded_amount` number, nullable, required — The payment refund amount(if applicable).
  - `refunded_at` string, date-time, nullable, required — When the payment was refunded (if applicable).
  - `refunds` object[], required — The refunds issued against this payment, newest first, including failed and canceled refund attempts. Limited to the 100 most recent.
    - `amount` number, required — The refunded amount as a decimal in the specified currency, such as 10.43 for $10.43 USD.
    - `created_at` string, date-time, required — The datetime the refund was created.
    - `currency` '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', required — The available currencies on the platform
    - `id` string, required — The unique identifier for the refund.
    - `status` 'pending' | 'requires_action' | 'succeeded' | 'failed' | 'canceled', required — The different statuses for a Refund object
  - `resolutions` object[], nullable, required — The resolution center cases opened by the customer on this payment. Null if the actor in context does not have the payment:resolution_center_case:read permission.
    - `customer_appealed` boolean, required — Whether the customer has filed an appeal after the initial resolution decision.
    - `customer_response_actions` ResolutionCenterCaseCustomerResponses[], required — The list of actions currently available to the customer.
    - `due_date` string, date-time, nullable, required — The deadline by which the next response is required. Null if no deadline is currently active. As a Unix timestamp.
    - `id` string, required — The unique identifier for the resolution.
    - `issue` 'forgot_to_cancel' | 'item_not_received' | 'significantly_not_as_described' | 'unauthorized_transaction' | 'product_unacceptable', required — The different types of issues a resolution can be
    - `merchant_appealed` boolean, required — Whether the merchant has filed an appeal after the initial resolution decision.
    - `merchant_response_actions` ResolutionCenterCaseMerchantResponses[], required — The list of actions currently available to the merchant.
    - `platform_response_actions` ResolutionCenterCasePlatformResponses[], required — The list of actions currently available to the Whop platform for moderating this resolution.
    - `status` 'merchant_response_needed' | 'customer_response_needed' | 'merchant_info_needed' | 'customer_info_needed' | 'under_platform_review' | 'customer_won' | 'merchant_won' | 'customer_withdrew', required — The statuses a resolution object can have
  - `retryable` boolean, required — True when the payment status is `open` and its membership is in one of the retry-eligible states (`active`, `trialing`, `completed`, or `past_due`), or when it is a failed initial billing-engine payment on a `drafted` membership with an unlimited-stock plan; otherwise false. Used to decide if Whop can attempt the charge again.
  - `risk_score` integer, nullable, required — Whop's in-house fraud risk score for this payment, from 0 (lowest risk) to 100 (highest risk). Null when the payment has not been scored or scoring has not yet completed.
  - `risk_signals` object, nullable, required — A curated set of factors behind the risk score, grouped by category (business transaction history, buyer, device). Each entry has a key, human-readable label, category, and value. Null when there is no risk assessment for this payment.
  - `settlement_amount` number, required — The total amount charged to the customer for this payment, including taxes and after any discounts. In the currency specified by the currency field.
  - `settlement_currency` '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', required — The available currencies on the platform
  - `settlement_exchange_rate` number, nullable, required — Deprecated. Always returns null.
  - `settlement_time_at` string, date-time, nullable, required — When this payment's funds post to the company's available balance, at midnight UTC. Known at payment time and never changes. The `ledger_account.funds_available` webhook carries the same `settlement_time_at` when that batch posts — match them to know these funds are now withdrawable.
  - `shipment` object, nullable, required — The shipment attached to this payment.
    - `carrier` string, nullable, required — The shipping carrier detected for this shipment. Null until a tracking update identifies it.
    - `id` string, required — The unique identifier for the shipment.
    - `status` 'unknown' | 'pre_transit' | 'in_transit' | 'out_for_delivery' | 'delivered' | 'available_for_pickup' | 'return_to_sender' | 'failure' | 'cancelled' | 'error', required — The status of a shipment
    - `tracking_number` string, required — The carrier-assigned tracking number used to look up shipment progress.
    - `tracking_url` string, required — A customer-facing URL to track this shipment's progress.
  - `shipping_address` object, nullable, required — The shipping address provided by the customer for physical goods. Null if no shipping address was collected.
    - `city` string, nullable, required — The city of the address.
    - `country` string, nullable, required — The country of the address.
    - `line1` string, nullable, required — The line 1 of the address.
    - `line2` string, nullable, required — The line 2 of the address.
    - `name` string, nullable, required — The name of the customer.
    - `postal_code` string, nullable, required — The postal code of the address.
    - `state` string, nullable, required — The state of the address.
  - `status` 'draft' | 'open' | 'paid' | 'pending' | 'uncollectible' | 'unresolved' | 'void', required — The status of a receipt
  - `substatus` 'succeeded' | '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', required — The friendly status of a payment. This is a derived status that provides a human-readable summary of the payment state, combining the underlying status and substatus fields.
  - `subtotal` number, nullable, required — The subtotal to show to the creator (excluding buyer fees).
  - `tax_amount` number, nullable, required — The calculated amount of the sales/VAT tax (if applicable).
  - `tax_behavior` 'exclusive' | 'inclusive' | 'unspecified' | 'unable_to_collect', required — The type of tax inclusivity applied to the receipt, for determining whether the tax is included in the final price, or paid on top.
  - `tax_refunded_amount` number, nullable, required — The amount of tax that has been refunded (if applicable).
  - `three_ds_verified` boolean, required — Whether 3D Secure authentication was completed for this payment.
  - `total` number, nullable, required — The total to show to the creator (excluding buyer fees).
  - `updated_at` string, date-time, required — The datetime the payment was last updated.
  - `usd_total` number, nullable, required — The total in USD to show to the creator (excluding buyer fees).
  - `user` object, nullable, required — The user that made this payment.
    - `email` string, nullable, required — The user's email address. Requires the member:email:read permission to access. Null if not authorized.
    - `id` string, required — The unique identifier for the user.
    - `name` string, nullable, required — The user's display name shown on their public profile.
    - `username` string, required — The user's unique username shown on their public profile.
  - `voidable` boolean, required — True when the payment is tied to a membership in `past_due`, the payment status is `open`, and the processor allows voiding payments; otherwise false.

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not found
- `422` — Verification required
- `429` — Too many requests
- `500` — Internal server error

---

[API](https://skmtc.net/whop/apis/whop-api.md) · [All operations](https://skmtc.net/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/whop/whop-api/versions/db0883548bc5/schema)
