Display card details
Last updated: September 9, 2026
Cards have non-sensitive details and sensitive details (credentials) that are subject to data protection regulations. You can:
- View the details in the Dashboard.
- Get the details using the API.
- Display the details to cardholders in your app or on your website, and enable them to copy the card number to their clipboard.
You must have the Admin user role or a custom role with one or both of the following permissions:
- Non-sensitive details –
View all transactions, cards, cardholders, and card productspermission - Sensitive details –
View card number and CVC2permission
For security reasons, no pre-defined roles include this permission by default.
- Sign in to the Dashboard.
- Go to Issuing > Cards.
- Use the search or filters to find the relevant card and then select it.
- On the Card details page, under About this card, you can see the non-sensitive details.
- To see the sensitive details, select View card credentials.
If your entity is regulated or you issue cards to your business, you can get sensitive card details using the API.
Call the Get card credentials endpoint, and provide the following:
{cardId}path parameter – The unique identifier for the card – for example,crd_fa6psq242dcd6fdn5gifcq1491credentialsquery parameter – The card credentials you want to retrieve, which can be one of or both of the following as a comma-separated list:number– The full primary account number (PAN)cvc2– The security code
get
https://{prefix}.api.checkout.com/issuing/cards/{cardId}/credentials?credentials=number,cvc2
1{2"number": 4242424242424242,3"cvc2": 6044}
To retrieve non-sensitive card details, call the Get card details endpoint, and provide the {cardId} path parameter.
get
https://{prefix}.api.checkout.com/issuing/cards/{cardId}
1{2"id": "crd_fa6psq242dcd6fdn5gifcq1491",3"client_id": "cli_vkuhvk4vjn2edkps7dfsq6emqm",4"entity_id": "ent_fa6psq242dcd6fdn5gifcq1491",5"cardholder_id": "crh_d3ozhf43pcq2xbldn2g45qnb44",6"card_product_id": "pro_7syjig3jq3mezlc3vjrdpfitl4",7"last_four": 1234,8"expiry_month": 5,9"expiry_year": 2025,10"status": "active",11"display_name": "JOHN KENNEDY",12"type": "virtual",13"billing_currency": "USD",14"issuing_country": "US",15"reference": "X-123456-N11",16"metadata": {17"udf1": "metadata1",18"udf2": "metadata2",19"udf3": "metadata3",20"udf4": "metadata4",21"udf5": "metadata5"22},23"revocation_date": "2029-03-12",24"root_card_id": "crd_fa6psq242dcd6fdn5gifcq1491",25"created_date": "2025-09-09T19:41:39Z",26"last_modified_date": "2025-09-09T19:41:39Z",27"_links": {28"self": {29"href": "https://{prefix}.api.checkout.com/issuing/cards/crd_fa6psq242dcd6fdn5gifcq1491",30"actions": [31"GET"32],33"types": [34"application/json"35]36},37"credentials": {38"href": "https://{prefix}.api.checkout.com/issuing/cards/crd_fa6psq242dcd6fdn5gifcq1491/credentials",39"actions": [40"GET"41],42"types": [43"application/json"44]45},46"revoke": {47"href": "https://{prefix}.api.checkout.com/issuing/cards/crd_fa6psq242dcd6fdn5gifcq1491/revoke",48"actions": [49"POST"50],51"types": [52"application/json"53]54},55"controls": {56"href": "https://{prefix}.api.checkout.com/issuing/controls?target_id=crd_fa6psq242dcd6fdn5gifcq1491",57"actions": [58"GET"59],60"types": [61"application/json"62]63}64},65"is_single_use": false66}
After you've integrated the Card Management Android SDK or iOS SDK, you can enable your cardholders to view their card details in your app.
Note
You must migrate to Android SDK version 3.0.0 or iOS SDK version 4.0.0. For guidance on how to update your integration, see Support – Issuing Card Management SDKs migration guide.
Follow these steps:
- Authenticate the cardholder.
- Retrieve the cardholder's cards and non-sensitive details.
- Retrieve the sensitive details.
Information
In the iOS SDK stub environment, you can provide any String instead of an access token, because all responses return mock data.
You are responsible for performing Strong Customer Authentication (SCA) on the cardholder for each session where they use functionality provided by the SDK. This applies to both the sandbox and production SDK environments.
Pass an access token that your app receives from your authentication back end.
1val token = "{Access_token}"2cardManager.logInSession(token)
Once you’ve authenticated the cardholder and your app, call the getCards() method to get all the cardholder's cards or getCards(cardId) to get a specific card and display a list of their cards and the following non-sensitive card details:
- The last four digits of the primary account number (PAN)
- The expiry month and year
- The cardholder's name
- The card's status –
active,inactive,revoked, orsuspended - The card ID – For example,
crd_fa6psq242dcd6fdn5gifcq1491
Note
The getCards() method throws a CardManagementError which you must catch. For example, using catch (as in the example) or runCatching.
1// Call coroutineBased getCards in the context of a coroutineScope2try {3// Get all the cardholder's cards4cardManager.getCards(statuses = setOf(CardState.ACTIVE, CardState.REVOKED))56// Get a specific card7cardManager.getCard(cardId: "<cardId>")8} catch (e: CardManagementError) {9when (error) {10is CardManagementError.Unauthenticated -> // Prompt login11is CardManagementError.ConnectionIssue -> // Show network error12else -> // Handle other errors13}14}
Once you've retrieved a cardholder's cards, you can use the following methods to retrieve each card's sensitive details:
Card.getPin()– The personal identification number (PIN) for a physical cardCard.getPan()– The full PANCard.getSecurityCode()– The security code (CVC2)Card.getPANAndSecurityCode()– The full PAN and CVC2
Every method is subject to a unique SCA flow. You can only request a single-use token after the SCA flow is completed. You must provide the token to the SDK to call the method.
The UI component protects the sensitive details and securely displays them to the cardholder only. They are never displayed to you, or sent to your server.
1val singleUseToken = "{Single_use_token_retrieved_after_SCA}"23// Request sensitive data via the card object4when (val result = card.getPin(singleUseToken)) {5is CardSecureDataResult.Success -> {6displaySecureView(result.data)7}8is CardSecureDataResult.Error -> {9showError(result.message)10handleError(result)11}12}
Note
Virtual cards do not have a PIN. If you call the getPin() method for a virtual card, you receive an Unauthenticated error.
You can enable cardholders to securely copy their card's primary account number (PAN) to the clipboard of their device. This feature includes:
- Secure authorization – Every method is subject to a unique SCA flow. You can only request a single-use token after the SCA flow is completed. The PAN is retrieved and copied asynchronously.
- Security validation – The cardholder must view the PAN before copying to prevent unauthorized access.
- Automatic logging – Successful and failed copy attempts are tracked for analytics.
- Granular error handling – Specific error cases are returned for different failure scenarios to enable troubleshooting.
The minimum supported SDK version for this feature is Android 7, API 24.
Call one of the following methods to display the PAN to the cardholder:
displayPan()displayPANAndSecurityCode()
Information
We recommend explaining this security requirement to the cardholder for a smooth user experience.
Call the copyPan method and provide the token:
1public suspend fun copyPan(singleUseToken: String): Result<Unit>
completionHandler is a closure executed on completion that returns a Result that indicates either success, or the reason for failure.
Note
To avoid errors, prevent the app from attempting multiple simultaneous copy operations.
You can receive the following error cases:
| Error | Description | Recovery action |
|---|---|---|
| The token was invalid or expired. | Authenticate the cardholder before calling the |
| The PAN was not viewed before copying. | Call one of the following methods before calling the
|
| The app could not copy the PAN returned by the API. | Check the clipboard permissions and network availability of the cardholder's device. |
| The Android version is not supported. This applies to API versions 29, 30, 31, and 32. | The |
1when (val result = card.copyPan(singleUseToken)) {2is CardSecureDataResult.Success -> {3showToast("Card number copied to clipboard")4}5is CardSecureDataResult.Error -> {6// Handle the error7}8}910// DEPRECATED using callbacks11card.copyPan(singleUseToken = "{Single_use_token}") { result ->12result.fold(13onSuccess = {1415},16onFailure = {1718}19)20}
After you've integrated the Card Management Web SDK, you can enable your cardholders to view their card details on your website or web application, and copy each value to their clipboard.
Initialize the SDK with your public API key:
1const sdk = new window.CheckoutCardManagement(<PUBLIC_API_KEY>);
You are responsible for performing Strong Customer Authentication (SCA) on the cardholder for each session where they use functionality provided by the SDK. This applies to both the sandbox and production environments.
Once the SCA flow is complete, request a single-use token from your authentication back end and pass it to the SDK. You can only generate one single-use token for each SCA flow you request.
Call the getCards() method with the cardholder ID prefixed with crh_, and a cardholder access token. The options object is optional, but if you provide it, statuses must be a non-empty array of active, inactive, suspended, or revoked. If the cardholder has no cards that match, the method returns an empty cards array.
1try {2const { cards } = await sdk.getCards('crh_d3ozhf43pcq2xbldn2g45qnb44', 'cardholderAccessToken', {3statuses: ['active', 'suspended'],4});56cards.forEach((card) => {7console.log(card.id, card.last4, card.status);8});9} catch (error) {10console.error(error.code, error.message);11}
If a request fails, the SDK rejects with an error object containing a code and a message. Branch on the code, because the message is intended for debugging and can change. For the full list of codes, see Handle errors.
Call the getCardDetails() method with the card ID prefixed with crd_, and a cardholder access token. The method returns the card's non-sensitive details, including the last four digits of the card number, the card's status, and its expiry date.
Note
getCardDetails() takes a cardholder access token, not the single-use token that mountCardCredentials() requires.
1try {2const { card } = await sdk.getCardDetails('crd_fa6psq242dcd6fdn5gifcq1491', 'cardholderAccessToken');34console.log(card.last4, card.status, card.expiryMonth, card.expiryYear);5} catch (error) {6console.error(error.code, error.message);7}
The method returns expiryMonth and expiryYear as strings, so you can pass the card straight to mountCardCredentials().
Call the mountCardCredentials() method to mount an iframe to the element you specify.
The iframe displays the card number, expiry date, and card verification value (CVV) to the cardholder, along with a button to copy each value.
1await sdk.mountCardCredentials(2'element_id',3{4cardId: 'crd_fa6psq242dcd6fdn5gifcq1491',5expiryDate: {6expiryMonth: '05', // For example, '01' for January7expiryYear: '2029',8},9},10'singleUseToken',11)
The credentials are visible for 30 seconds.
After this period of time, the SDK emits a checkout:cardCredentialsUnmounted event and removes the iframe from the DOM.
To display the credentials again, complete a new SCA flow, request a new single-use token, and call the method again.
The iframe protects the sensitive details and securely displays them to the cardholder only. They are never displayed to you, or sent to your server.
To override the default styles for the credentials, or to add the SDK's TypeScript types to your project, see Customize the user interface.
To build your own experience around the credentials, such as a success message when a cardholder copies a value, see SDK events.