--- title: Replacement cards subtitle: Learn how to replace cards that are expired, damaged, lost, or stolen. route: /issuing/cards/replacements --- # Replacement cards Learn how to replace cards that are expired, damaged, lost, or stolen. You can replace cards that are expired, damaged, lost, or stolen. The process differs slightly for each kind of card replacement. - **Card expired**: The card has reached its expiration date and is no longer valid. - **Card damaged**: The cardholder requests a new card for a reason other than lost or stolen (for example, a physical card’s chip no longer reads properly). - **Card lost/stolen**: The card is reported lost or stolen and a new card number, expiry, security code are issued. Depending on the scenario, the replacement card might have a different card number, expiry, or security code from the original: | Scenario | New card number | New security code | New expiry | | -------------------- | --------------- | ----------------- | ---------- | | **Card expired** | No | Yes | Yes | | **Card damaged** | No | Yes | Yes | | **Card lost/stolen** | Yes | Yes | Yes | ## Replacements for expired or damaged cards Physical cards can get damaged, and both physical cards and virtual cards expire, but you can create replacement cards that have the same card number. The cardholder can continue to use the original card before the replacement card is activated, as long as the card isn’t too damaged or already expired. Activating the replacement card cancels the original card if it isn’t already canceled. You can use the [Dashboard](https://dashboard.stripe.com/issuing/cards) or the [Create a card](https://docs.stripe.com/api/issuing/cards.md) endpoint to replace an expired or damaged card. # Dashboard > This is a Dashboard for when testing-method is without-code. View the original doc at https://docs.stripe.com/issuing/cards/replacements?testing-method=without-code. 1. Visit the [Cards tab](https://dashboard.stripe.com/issuing/cards) in the Issuing Dashboard. ![Issuing cards page](images/issuing/cards-page.png) 1. Search for the card you want to replace and click it to view its details. ![Issuing card details sidebar](images/issuing/card-details.png) 1. Click **Replace card** in the sidebar on the right. 1. Select **Your card is expiring or expired** or **Your card is damaged** and click **Continue** if you’re replacing a physical card, or **Replace card** if you’re replacing a virtual card. ![Issuing card replace modal](images/issuing/replace-card-modal.png) 1. If the card you’re replacing is a physical card, enter the shipping details for the replacement card and click **Replace card**. ![Issuing card replace modal shipping details form](images/issuing/replace-card-shipping-details.png) # API > This is a API for when testing-method is with-code. View the original doc at https://docs.stripe.com/issuing/cards/replacements?testing-method=with-code. To create a replacement card for an expired or damaged card, create a [Card](https://docs.stripe.com/api.md#issuing_card_object) with `replacement_for` using the expired or damaged `Card` ID and `replacement_reason` set to `expired` or `damaged`. ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Issuing.CardCreateOptions { Cardholder = "ich_1Cm3pZIyNTgGDVfzI83rasFP", Currency = "usd", Type = "virtual", ReplacementFor = "ic_1LL8wgLUVt6Jcs5dgLLfwcAE", ReplacementReason = "expired", }; var service = new Stripe.Issuing.CardService(); Stripe.Issuing.Card card = service.Create(options); ``` ```go stripe.Key = "<>" params := &stripe.IssuingCardParams{ Cardholder: stripe.String("ich_1Cm3pZIyNTgGDVfzI83rasFP"), Currency: stripe.String(string(stripe.CurrencyUSD)), Type: stripe.String(string(stripe.IssuingCardTypeVirtual)), ReplacementFor: stripe.String("ic_1LL8wgLUVt6Jcs5dgLLfwcAE"), ReplacementReason: stripe.String(string(stripe.IssuingCardReplacementReasonExpired)), }; result, err := card.New(params); ``` ```java Stripe.apiKey = "<>"; CardCreateParams params = CardCreateParams.builder() .setCardholder("ich_1Cm3pZIyNTgGDVfzI83rasFP") .setCurrency("usd") .setType(CardCreateParams.Type.VIRTUAL) .setReplacementFor("ic_1LL8wgLUVt6Jcs5dgLLfwcAE") .setReplacementReason(CardCreateParams.ReplacementReason.EXPIRED) .build(); Card card = Card.create(params); ``` ```node const stripe = require('stripe')('<>'); const card = await stripe.issuing.cards.create({ cardholder: 'ich_1Cm3pZIyNTgGDVfzI83rasFP', currency: 'usd', type: 'virtual', replacement_for: 'ic_1LL8wgLUVt6Jcs5dgLLfwcAE', replacement_reason: 'expired', }); ``` ```python import stripe stripe.api_key = "<>" card = stripe.issuing.Card.create( cardholder="ich_1Cm3pZIyNTgGDVfzI83rasFP", currency="usd", type="virtual", replacement_for="ic_1LL8wgLUVt6Jcs5dgLLfwcAE", replacement_reason="expired", ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $card = $stripe->issuing->cards->create([ 'cardholder' => 'ich_1Cm3pZIyNTgGDVfzI83rasFP', 'currency' => 'usd', 'type' => 'virtual', 'replacement_for' => 'ic_1LL8wgLUVt6Jcs5dgLLfwcAE', 'replacement_reason' => 'expired', ]); ``` ```ruby Stripe.api_key = '<>' card = Stripe::Issuing::Card.create({ cardholder: 'ich_1Cm3pZIyNTgGDVfzI83rasFP', currency: 'usd', type: 'virtual', replacement_for: 'ic_1LL8wgLUVt6Jcs5dgLLfwcAE', replacement_reason: 'expired', }) ``` ## Replacements for lost or stolen cards Lost or stolen cards get new card numbers for security reasons. We need to cancel the original cards before we can create the replacement card. # Dashboard > This is a Dashboard for when testing-method is without-code. View the original doc at https://docs.stripe.com/issuing/cards/replacements?testing-method=without-code. 1. Visit the [Cards tab](https://dashboard.stripe.com/issuing/cards) in the Issuing Dashboard. ![Issuing cards page](images/issuing/cards-page.png) 1. Search for the card you want to replace and click it to view its details. ![Issuing card details sidebar](images/issuing/card-details.png) 1. Click **Replace card** in the sidebar on the right. 1. Select **Your card is lost** or **Your card was stolen or used fraudulently** and click **Continue** if you’re replacing a physical card, or **Replace card** if you’re replacing a virtual card. ![Issuing card replace modal](images/issuing/replace-card-modal.png) 1. If the card you’re replacing is a physical card, enter the shipping details for the replacement card and click **Replace card**. ![Issuing card replace modal shipping details form](images/issuing/replace-card-shipping-details.png) # API > This is a API for when testing-method is with-code. View the original doc at https://docs.stripe.com/issuing/cards/replacements?testing-method=with-code. To create a replacement card for a lost or stolen card: 1. Cancel the lost or stolen card by using the [update card](https://docs.stripe.com/api.md#update_issuing_card) endpoint to set its `status` to `canceled` and its `cancellation_reason` to `lost` or `stolen`. 1. Create a [Card](https://docs.stripe.com/api.md#issuing_card_object) with `replacement_for` using the lost or stolen `Card` ID and `replacement_reason` set to `lost` or `stolen`. ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Issuing.CardUpdateOptions { Status = "canceled", CancellationReason = "lost", }; var service = new Stripe.Issuing.CardService(); Stripe.Issuing.Card card = service.Update("ic_1CoYuRKEl2ztzE5GIEDjQiUI", options); ``` ```go stripe.Key = "<>" params := &stripe.IssuingCardParams{ Status: stripe.String(string(stripe.IssuingCardStatusCanceled)), CancellationReason: stripe.String(string(stripe.IssuingCardCancellationReasonLost)), }; result, err := card.Update("ic_1CoYuRKEl2ztzE5GIEDjQiUI", params); ``` ```java Stripe.apiKey = "<>"; Card resource = Card.retrieve("ic_1CoYuRKEl2ztzE5GIEDjQiUI"); CardUpdateParams params = CardUpdateParams.builder() .setStatus(CardUpdateParams.Status.CANCELED) .setCancellationReason(CardUpdateParams.CancellationReason.LOST) .build(); Card card = resource.update(params); ``` ```node const stripe = require('stripe')('<>'); const card = await stripe.issuing.cards.update( 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', { status: 'canceled', cancellation_reason: 'lost', } ); ``` ```python import stripe stripe.api_key = "<>" card = stripe.issuing.Card.modify( "ic_1CoYuRKEl2ztzE5GIEDjQiUI", status="canceled", cancellation_reason="lost", ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $card = $stripe->issuing->cards->update( 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', [ 'status' => 'canceled', 'cancellation_reason' => 'lost', ] ); ``` ```ruby Stripe.api_key = '<>' card = Stripe::Issuing::Card.update( 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', { status: 'canceled', cancellation_reason: 'lost', }, ) ``` ```dotnet StripeConfiguration.ApiKey = "<>"; var options = new Stripe.Issuing.CardCreateOptions { Cardholder = "ich_1Cm3pZIyNTgGDVfzI83rasFP", Currency = "usd", Type = "virtual", ReplacementFor = "ic_1CoYuRKEl2ztzE5GIEDjQiUI", ReplacementReason = "lost", }; var service = new Stripe.Issuing.CardService(); Stripe.Issuing.Card card = service.Create(options); ``` ```go stripe.Key = "<>" params := &stripe.IssuingCardParams{ Cardholder: stripe.String("ich_1Cm3pZIyNTgGDVfzI83rasFP"), Currency: stripe.String(string(stripe.CurrencyUSD)), Type: stripe.String(string(stripe.IssuingCardTypeVirtual)), ReplacementFor: stripe.String("ic_1CoYuRKEl2ztzE5GIEDjQiUI"), ReplacementReason: stripe.String(string(stripe.IssuingCardReplacementReasonLost)), }; result, err := card.New(params); ``` ```java Stripe.apiKey = "<>"; CardCreateParams params = CardCreateParams.builder() .setCardholder("ich_1Cm3pZIyNTgGDVfzI83rasFP") .setCurrency("usd") .setType(CardCreateParams.Type.VIRTUAL) .setReplacementFor("ic_1CoYuRKEl2ztzE5GIEDjQiUI") .setReplacementReason(CardCreateParams.ReplacementReason.LOST) .build(); Card card = Card.create(params); ``` ```node const stripe = require('stripe')('<>'); const card = await stripe.issuing.cards.create({ cardholder: 'ich_1Cm3pZIyNTgGDVfzI83rasFP', currency: 'usd', type: 'virtual', replacement_for: 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', replacement_reason: 'lost', }); ``` ```python import stripe stripe.api_key = "<>" card = stripe.issuing.Card.create( cardholder="ich_1Cm3pZIyNTgGDVfzI83rasFP", currency="usd", type="virtual", replacement_for="ic_1CoYuRKEl2ztzE5GIEDjQiUI", replacement_reason="lost", ) ``` ```php $stripe = new \Stripe\StripeClient('<>'); $card = $stripe->issuing->cards->create([ 'cardholder' => 'ich_1Cm3pZIyNTgGDVfzI83rasFP', 'currency' => 'usd', 'type' => 'virtual', 'replacement_for' => 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', 'replacement_reason' => 'lost', ]); ``` ```ruby Stripe.api_key = '<>' card = Stripe::Issuing::Card.create({ cardholder: 'ich_1Cm3pZIyNTgGDVfzI83rasFP', currency: 'usd', type: 'virtual', replacement_for: 'ic_1CoYuRKEl2ztzE5GIEDjQiUI', replacement_reason: 'lost', }) ``` ## All replacements All replacement cards have renewed expiration dates and new security codes. Authorizations made on the original cards are migrated to the replacements, but might still clear on the original cards. Like the originals, replacement cards must be activated before use. ## Card-on-file updating For many of our card programs, Stripe automatically updates the card details on file with acquiring merchants, even when a card is completely reissued. This feature offers several benefits, including saving your cardholders the hassle of manually re-entering card details when their cards expire. ### Card expired or damaged Updating the payment details for a card that has been replaced due to expiration or damage ensures that recurring payments and stored payment details continue to function. This enables cardholders to continue making payments when they replace a card. ### Card lost or stolen Stripe doesn’t update businesses with the new card number, expiry, and security code of a replacement card if the old card is marked as being lost or stolen.