---
title: "Create setup intent"
method: POST
path: "/setup_intents"
tags: ["Setup intents"]
---

# Create setup intent

`POST /setup_intents`

Save a buyer's payment method for later without charging it. Provide a confirmation token for a method the buyer just supplied, or an existing payment method to re-verify. The buyer may still have a step to complete — 3D Secure, a hosted enrollment, linking a bank account — so poll the setup intent's status endpoint for what to do next.

Required permissions:
 - `payment:charge`
 - `member:basic:read`
 - `member:email:read`

## Request body

- union — Parameters for CreateSetupIntent
  - object — Autogenerated input type of CreateSetupIntent
    - `company_id` string, required — The ID of the company to save the payment method for.
    - `confirmation_token` string, required — A confirmation token ID (ctok_) describing a payment method the buyer just supplied. Provide this or payment_method_id, not both.
    - `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' — The available currencies on the platform
    - `email` string, nullable — Overrides the buyer email carried on the confirmation token, resolving or creating the Whop user the method belongs to. Ignored when the caller IS the buyer or 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 setup intent.
    - `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.
  - object — Autogenerated input type of CreateSetupIntent
    - `company_id` string, required — The ID of the company to save the payment method for.
    - `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' — The available currencies on the platform
    - `email` string, nullable — Overrides the buyer email carried on the confirmation token, resolving or creating the Whop user the method belongs to. Ignored when the caller IS the buyer or 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 setup intent.
    - `payment_method_id` string, required — An existing payment method (payt_) to re-verify and save. Provide this or confirmation_token, not both.
    - `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.

## Response `200`

A successful response

- object — A setup intent allows a user to save a payment method for future use without making an immediate purchase.
  - `checkout_configuration` object, nullable, required — The checkout session configuration associated with this setup intent. Null if no checkout session was used.
    - `id` string, required — The unique identifier for the checkout session.
  - `client_secret` string, nullable, required — The credential the buyer's surface presents to poll this setup intent and set its return URL. Returned when the setup is created and still has something to finish — hold on to it, because a later read will not repeat it. Null when the setup settled on the spot and there is nothing left to authorize. It unlocks this setup intent and nothing else; treat it like a password for that one attempt.
  - `company` object, nullable, required — The company that initiated this setup intent. Null if the company has been deleted.
    - `id` string, required — The unique identifier for the company.
  - `created_at` string, date-time, required — The datetime the setup intent was created.
  - `error_message` string, nullable, required — A human-readable error message explaining why the setup intent failed. Null if no error occurred.
  - `id` string, required — The unique identifier for the setup intent.
  - `member` object, nullable, required — The company member associated with this setup intent. Null if the user is not a member.
    - `id` string, required — The unique identifier for the company member.
    - `user` object, nullable, required — The user for this member, if any.
      - `email` string, nullable, required — The digital mailing address of the user.
      - `id` string, required — The unique identifier for the company member user.
      - `name` string, nullable, required — The user's full name.
      - `username` string, required — The whop username.
  - `metadata` object, nullable, required — Custom key-value pairs attached to this setup intent. Null if no metadata was provided.
  - `payment_method` object, nullable, required — The saved payment method created by this setup intent. Null if the setup has not completed successfully.
    - `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.
    - `mailing_address` object, nullable, required — The mailing address associated with the payment method's user
      - `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.
    - `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.
  - `status` 'processing' | 'succeeded' | 'canceled' | 'requires_action', required — The status of the setup intent.
  - `three_ds_verified` boolean, required — Whether 3D Secure authentication was completed when this payment method was set up.

## 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)
