Issuing cards Invite Only

    Learn how to create cardholders and issue credit cards to them.

    You can create both virtual and physical cards in your Dashboard or with the API below. Virtual cards are free, instantly usable, and easy to manage. Physical cards have a small cost, and require slightly more effort to manage.

    Issuing via the API

    Issuing a new card using Stripe is a two-step process:

    1. Create a cardholder with some information about them
    2. Create a card for the cardholder

    Issued cards must be activated before they can be used to make purchases.

    Step 1: Create a cardholder

    A cardholder represents an individual or business entity that can be issued cards. To get started, create a cardholder with a name, billing information, entity type, and any additional details you want to provide.

    We highly recommend you include additional information about a cardholder, such as a phone number and email address. This can make it easier for you to identify and verify them if they need to report a problem with a card (e.g., the card was lost or used to make a fraudulent purchase).

    curl https://api.stripe.com/v1/issuing/cardholders \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d name="Jenny Rosen" \ -d email="jenny.rosen@example.com" \ -d phone_number="+18008675309" \ -d status=active \ -d type=individual \ -d "billing[name]"="Jenny Rosen" \ -d "billing[address][line1]"="1234 Main Street" \ -d "billing[address][city]"="San Francisco" \ -d "billing[address][state]"=CA \ -d "billing[address][postal_code]"=94111 \ -d "billing[address][country]"=US
    # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' cardholder = Stripe::Issuing::Cardholder.create({ name: 'Jenny Rosen', email: 'jenny.rosen@example.com', phone_number: '+18008675309', status: 'active', type: 'individual', billing: { name: 'Jenny Rosen', address: { line1: '1234 Main Street', city: 'San Francisco', state: 'CA', postal_code: '94111', country: 'US', }, }, })
    # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' cardholder = stripe.issuing.Cardholder.create( name='Jenny Rosen', email='jenny.rosen@example.com', phone_number='+18008675309', status='active', type='individual', billing={ 'name': 'Jenny Rosen', 'address': { 'line1': '1234 Main Street', 'city': 'San Francisco', 'state': 'CA', 'postal_code': '94111', 'country': 'US', } } )
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $cardholder = \Stripe\Issuing\Cardholder::create([ 'name' => 'Jenny Rosen', 'email' => 'jenny.rosen@example.com', 'phone_number' => '+18008675309', 'status' => 'active', 'type' => 'individual', 'billing' => [ 'name' => 'Jenny Rosen', 'address' => [ 'line1' => '1234 Main Street', 'city' => 'San Francisco', 'state' => 'CA', 'postal_code' => '94111', 'country' => 'US', ], ], ]);
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Map<String, Object> addressParams = new HashMap<String, Object>(); addressParams.put("line1", "1234 Main Street"); addressParams.put("city", "San Francisco"); addressParams.put("state", "CA"); addressParams.put("postal_code", "94111"); addressParams.put("country", "US"); Map<String, Object> billingParams = new HashMap<String, Object>(); billingParams.put("name", "Jenny Rosen"); billingParams.put("address", addressParams); Map<String, Object> cardholderParams = new HashMap<>(); cardholderParams.put("name", "Jenny Rosen"); cardholderParams.put("email", "jenny.rosen@example.com"); cardholderParams.put("phone_number", "+18008675309"); cardholderParams.put("status", "active"); cardholderParams.put("type", "individual"); cardholderParams.put("billing", billingParams); Cardholder cardholder = Cardholder.create(cardholderParams);
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const cardholder = stripe.issuing.cardholders.create({ name: 'Jenny Rosen', email: 'jenny.rosen@example.com', phone_number: '+18008675309', status: 'active', type: 'individual', billing: { name: 'Jenny Rosen', address: { line1: '1234 Main Street', city: 'San Francisco', state: 'CA', postal_code: '94111', country: 'US', }, }, });
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" cardholder, err := New(&stripe.IssuingCardholderParams{ Billing: &stripe.IssuingBillingParams{ Address: &stripe.AddressParams{ Country: stripe.String("US"), Line1: stripe.String("1234 Main Street"), City: stripe.String("San Francisco"), PostalCode: stripe.String("94111"), State: stripe.String("CA"), }, Name: stripe.String("Jenny Rosen"), }, Email: stripe.String("jenny.rosen@example.com"), Name: stripe.String("Jenny Rosen"), PhoneNumber: stripe.String("+18008675309"), Status: stripe.String(string(stripe.IssuingCardholderStatusActive)), Type: stripe.String(string(stripe.IssuingCardholderTypeIndividual)), })
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new CardholderCreateOptions { Billing = new BillingOptions { Name = "Jenny Rosen", Address = new AddressOptions { Line1 = "1234 Main Street", City = "San Francisco", State = "CA", PostalCode = "94111", Country = "US", }, }, Email = "jenny.rosen@example.com", PhoneNumber = "+18008675309", Name = "Jenny Rosen", Status = "active", Type = "individual", }; var service = new CardholderService(); Cardholder card = service.Create(options);

    Stripe returns a Cardholder object that contains the information you provided, and sends the issuing_cardholder.created webhook event.

    Step 2: Create a card

    After creating a cardholder, create a card that is assigned to them. This request contains the ID of the Cardholder object, currency, and card type (either physical or virtual). If you’re creating a physical card, a shipping address is required.

    curl https://api.stripe.com/v1/issuing/cards \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d cardholder=ich_1Cm3pZIyNTgGDVfzI83rasFP \ -d type=virtual \ -d currency=usd
    # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' card = Stripe::Issuing::Card.create({ cardholder: 'ich_1Cm3pZIyNTgGDVfzI83rasFP', type: 'virtual', currency: 'usd', })
    # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' card = stripe.issuing.Card.create( cardholder='ich_1Cm3pZIyNTgGDVfzI83rasFP', type='virtual', currency='usd' )
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $card = \Stripe\Issuing\Card::create([ 'cardholder' => 'ich_1Cm3pZIyNTgGDVfzI83rasFP', 'type' => 'virtual', 'currency' => 'usd', ]);
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Map<String, Object> cardParams = new HashMap<>(); cardParams.put("cardholder", "ich_1Cm3pZIyNTgGDVfzI83rasFP"); cardParams.put("type", "virtual"); cardParams.put("currency", "usd"); Card card = Card.create(cardParams);
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const card = stripe.issuing.cards.create({ cardholder: 'ich_1Cm3pZIyNTgGDVfzI83rasFP', type: 'virtual', currency: 'usd', });
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" card, err := New(&stripe.IssuingCardParams{ Cardholder: stripe.String("ich_1Cm3pZIyNTgGDVfzI83rasFP"), Currency: stripe.String(string(stripe.CurrencyUSD)), Type: stripe.String(string(stripe.IssuingCardShippingTypeVirtual)), })
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new CardCreateOptions { Cardholder = "ich_1Cm3pZIyNTgGDVfzI83rasFP", Type = "virtual", Currency = "usd", }; var service = new CardService(); Card card = service.Create(options);

    Stripe returns an Issuing Card object upon creation, and sends the issuing_card.created event.

    Stripe handles the printing and shipping of physical cards on a daily basis. If multiple cards are created using the same shipping address, they are combined into a single shipment.

    Activating a card

    You must activate issued cards before they can be used.

    Option 1: Activate by default

    When you create the card, set the status to active.

    Option 2: Use the card update API directly

    After creating an inactive card, update the card and set its status to active.

    curl https://api.stripe.com/v1/issuing/cards/ic_1CoYuRKEl2ztzE5GIEDjQiUI \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d status=active
    # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' Stripe::Issuing::Card.update( 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', { status: 'active', } )
    # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' card = stripe.issuing.Card.modify( 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', status='active' )
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); \Stripe\Issuing\Card::update( 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', [ 'status' => 'active', ] );
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Card card = Card.retrieve("ic_1CoYuRKEl2ztzE5GIEDjQiUI"); Map<String, Object> params = new HashMap<>(); params.put("status", "active"); card.update(params);
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const card = stripe.issuing.cards.update('ic_1CoYuRKEl2ztzE5GIEDjQiUI', { status: 'active', });
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" card, err := card.Update("ic_1CoYuRKEl2ztzE5GIEDjQiUI", &stripe.IssuingCardParams{ Status: stripe.String(string(stripe.IssuingCardStatusActive)), })
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new CardUpdateOptions { Status = "active", }; var service = new CardService(); Card card = service.Update("ic_1CoYuRKEl2ztzE5GIEDjQiUI", options);

    You can use the API to list issued cards and look up the issued card that needs activating. Additional parameters can be included to filter the results, such as the cardholder ID and card status. Once you have the necessary card ID, you can then activate it.

    curl https://api.stripe.com/v1/issuing/cards \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d cardholder=ich_1Cm3pZIyNTgGDVfzI83rasFP \ -d status=inactive
    # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' cards = Stripe::Issuing::Card.list({ status: 'inactive', cardholder: 'ich_1Cm3pZIyNTgGDVfzI83rasFP', })
    # Set your secret key: remember to change this to your live secret key in production # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' cards = stripe.issuing.Card.list( status='inactive', cardholder='ich_1Cm3pZIyNTgGDVfzI83rasFP' )
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $cards = \Stripe\Issuing\Card::all([ 'status' => 'inactive', 'cardholder' => 'ich_1Cm3pZIyNTgGDVfzI83rasFP', ]);
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Map<String, Object> params = new HashMap<>(); params.put("status", "inactive"); params.put("cardholder", "ich_1Cm3pZIyNTgGDVfzI83rasFP"); CardCollection cards = Card.list(params);
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const cards = stripe.issuing.cards.list({ status: 'inactive', cardholder: 'ich_1Cm3pZIyNTgGDVfzI83rasFP', );
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" list, err := card.List(&stripe.IssuingCardListParams{ Status: "inactive", Cardholder: "ich_1Cm3pZIyNTgGDVfzI83rasFP", })
    // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new CardListOptions { Status = "inactive", Cardholder = "ich_1Cm3pZIyNTgGDVfzI83rasFP", }; var service = new CardService(); StripeList<Card> response = service.List(options);

    Option 3: Elements for logged out users

    Use Elements if you want to provide your users with a quick form for self-activation where they enter their card number instead of logging into your application.

    Elements can securely collect the card information to create a Source object.

    <script src="https://js.stripe.com/v3/"></script> <form action="/charge" method="post" id="payment-form"> <div class="form-row"> <label for="card-element"> Credit card to activate </label> <div id="card-element"> <!-- A Stripe Element will be inserted here. --> </div> <!-- Used to display form errors. --> <div id="card-errors" role="alert"></div> </div> <button>Activate Card</button> </form>
    /** * The CSS shown here will not be introduced in the Quickstart guide, but shows * how you can use CSS to style your Element's container. */ .StripeElement { background-color: white; height: 40px; padding: 10px 12px; border-radius: 4px; border: 1px solid transparent; box-shadow: 0 1px 3px 0 #e6ebf1; -webkit-transition: box-shadow 150ms ease; transition: box-shadow 150ms ease; } .StripeElement--focus { box-shadow: 0 1px 3px 0 #cfd7df; } .StripeElement--invalid { border-color: #fa755a; } .StripeElement--webkit-autofill { background-color: #fefde5 !important; }
    // Create a Stripe client. var stripe = Stripe('pk_test_TYooMQauvdEDq54NiTphI7jx'); // Create an instance of Elements. var elements = stripe.elements(); // Custom styling can be passed to options when creating an Element. // (Note that this demo uses a wider set of styles than the guide below.) var style = { base: { color: '#32325d', lineHeight: '18px', fontFamily: '"Helvetica Neue", Helvetica, sans-serif', fontSmoothing: 'antialiased', fontSize: '16px', '::placeholder': { color: '#aab7c4' } }, invalid: { color: '#fa755a', iconColor: '#fa755a' } }; // Create an instance of the card Element. var card = elements.create('card', {style: style}); // Add an instance of the card Element into the `card-element` <div>. card.mount('#card-element');
    See all 57 lines // Handle real-time validation errors from the card Element. card.addEventListener('change', function(event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } }); // Handle form submission. var form = document.getElementById('payment-form'); form.addEventListener('submit', function(event) { event.preventDefault(); stripe.createSource(card).then(function(result) { if (result.error) { // Inform the user if there was an error. var errorElement = document.getElementById('card-errors'); errorElement.textContent = result.error.message; } else { // Send the source to your server. stripeSourceHandler(result.source); } }); });

    After creating a source, include its ID as the value for source when you retrieve a list of cards. This filters the list so that only the card represented by the source is returned. You can then activate it using the ID returned, similarly to Option #2 above.

    Option 4: Manual activations

    If necessary, you can also activate a card in the Dashboard. Select the card you wish to activate, then click Activate card.

    Next steps

    Congrats! You can now issue cards to cardholders. You can learn more about managing cards, receiving authorizations, and testing your integration:

    Was this page helpful?

    Thank you for helping improve Stripe's documentation. If you need help or have any questions, please consider contacting support.

    On this page