Issuing Cards Invite Only

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

    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.

    {
      "id": "ich_1Cm3pZIyNTgGDVfzI83rasFP",
      "object": "issuing.cardholder",
      "billing": {
        "address": {
          "city": "San Francisco",
          "country": "US",
          "line1": "1234 Main Street",
          "postal_code": "94111",
          "state": "CA"
    See all 23 lines }, "name": "Jenny Rosen" }, "created": 1531159885, "email": "jenny.rosen@example.com", "livemode": false, "metadata": { }, "name": "Jenny Rosen", "phone_number": "+18008675309", "status": "active", "type": "individual" }

    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

    Issued cards must be activated before they can be used. To do this, 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);
    

    We recommend using Elements to create a card activation form that securely collects the inactive card’s details from your cardholder, then create a Source object. The source can be used to filter the results for listing cards, returning only the card that needs to be activated.

    <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 a value for source when you retrieve a list of cards. This filters the list so only the card represented by the source is returned. You can then activate it using the ID returned.

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

    Digital Wallets

    Stripe Issuing cards work in Apple Pay, Google Pay, and Samsung Pay wallets out of the box.

    In order for an end-user to successfuly load a card into their device, the Cardholder associated with that Card must have its phone_number and/or email property set. This will be used to verify the cardholder (via SMS or email) during the onboarding flow. If neither field is set, users will see a “card not supported” error when attempting to onboard.

    Authorizations made on a card via a digital wallet will be identifiable by their wallet_provider field.

    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