{"templateId":"markdown","versions":[{"version":"v1","label":"v1","link":"/products/checkout/ios/v1/card-validator","default":false,"active":false,"folderId":"bfac8b17"},{"version":"v2","label":"v2","link":"/products/checkout/ios/v2/card-validator","default":false,"active":true,"folderId":"bfac8b17"},{"version":"v3","label":"v3","link":"/products/checkout/ios/v3/card-validator","default":false,"active":false,"folderId":"bfac8b17"},{"version":"v4","label":"v4","link":"/products/checkout/ios/v4/card-validator","default":false,"active":false,"folderId":"bfac8b17"},{"version":"v5","label":"v5 (Latest)","link":"/products/checkout/ios/card-validator","default":true,"active":false,"folderId":"bfac8b17"}],"sharedDataIds":{"sidebar":"sidebar-products/checkout/ios/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["partial","admonition"]},"custom_product":"Checkout","type":"markdown"},"seo":{"title":"Card Validation","description":"Worldpay for Developers - docs, code examples, resources and tools. Everything you need to build your omnichannel payment solution.","siteUrl":"https://docs.worldpay.com/access","image":"/access/assets/worldpay-logo-light.21b7daf79984773a9fcd7d4fbcb07ae5289dfffd6023c4c3dca720c7058e53dc.33f780a6.svg","keywords":"documentation, api, openapi, sdks, developer, payments, json, payouts, 3ds","jsonLd":{"@context":"https://schema.org","@type":"Organization","url":"https://docs.worldpay.com/access","name":"Worldpay"},"meta":[{"name":"google-site-verification","content":"zjziIKaP3ImsqsfhYnEBnq1R85UabiSwl7HTXuwtZuo"},{"name":"doc_product","content":"Access"},{"name":"doc_category","content":"Documentation"}],"llmstxt":{"hide":false,"sections":[{"title":"Payments API","description":"Payment orchestration API combining fraud assessment, 3ds authentication, SCA exemptions, Worldpay Token creation and a card or wallet based payment.","includeFiles":["products/payments/@20240601/**/*"],"excludeFiles":[]},{"title":"Payment Queries API","description":"Querying your payments data, based on a variety of parameters.","includeFiles":["products/payment-queries/@v1/**/*"],"excludeFiles":[]},{"title":"Card BIN Data API","description":"Provides detailed information about a card.","includeFiles":["products/card-bin/@v1/**/*"],"excludeFiles":[]},{"title":"3DS Authentication API","description":"Request 3DS authentication to protect against fraud, be SCA compliant and to shift liability using this standalone API.","includeFiles":["products/3ds/@v3/**/*"],"excludeFiles":[]},{"title":"FraudSight API","description":"Request a risk assessment and receive a response with an outcome (e.g. lowRisk) using this standalone API.","includeFiles":["products/fraudsight/@v1/**/*"],"excludeFiles":[]},{"title":"Checkout SDK","description":"Integrate using our clientside SDKs for both web and native devices. Benefit from SAQ-A/PCI-SSF compliance.","includeFiles":["products/checkout/web/@v2/**/*","products/checkout/ios/@v4/**/*","products/checkout/android/@v4/**/*","products/checkout/react-native/@v3/**/*","products/checkout/flutter/@v1/**/*"],"excludeFiles":[]},{"title":"Tokens API","description":"Minimizes the exposure of sensitive card details and increases the security of your customer's card details.","includeFiles":["products/tokens/@v3/**/*"],"excludeFiles":[]},{"title":"Card Payments API","description":"Request a card payment using this standalone API, requires separate requests for 3DS, Fraud assessment etc.","includeFiles":["products/card-payments/@v7/**/*"],"excludeFiles":[]},{"title":"Card Verifications API","description":"Verify your customer's card to maximize your authentication rates.","includeFiles":["products/card-verifications/@v6/**/*"],"excludeFiles":[]},{"title":"Account Payouts API","description":"Send funds to your customer's bank accounts and search for payouts using parameters.","includeFiles":["products/account-payouts/@20250101/**/*"],"excludeFiles":[]},{"title":"APMs","description":"Pay using eWallets, bank transfers, direct debits, local card schemes, Postpay and eInvoice/ Buy Now Pay Later.","includeFiles":["products/apms/@20240701/**/*"],"excludeFiles":[]},{"title":"Balance API","description":"Request your account details for a single account or all accounts under an entity.","includeFiles":["products/balance/@20250101/**/*"],"excludeFiles":[]},{"title":"Card Payouts API","description":"Send funds to your customer's cards.","includeFiles":["products/card-payouts/@v4/**/*"],"excludeFiles":[]},{"title":"Events (Webhooks)","description":"Receive status updates from Access Worldpay by setting up a webhook.","includeFiles":["products/events/@v1/**/*"],"excludeFiles":[]},{"title":"FX API","description":"Manage Foreign Exchange (FX) on your payments.","includeFiles":["products/fx/@v1/**/*"],"excludeFiles":[]},{"title":"Hosted Payment Pages (HPP) API","description":"Our low-code option to take payments securely at the lowest PCI compliance level - SAQ A.","includeFiles":["products/hosted-payment-pages/@v1/**/*"],"excludeFiles":[]},{"title":"Money Transfers API","description":"Money Transfer OCTs (Original Credit Transaction) allow funds to be pushed to an eligible card in 30 minutes or less.","includeFiles":["products/money-transfers/@v1/**/*"],"excludeFiles":[]},{"title":"Parties API","description":"Create parties, manage your payout instruments and beneficial owners and carry out identity verification checks.","includeFiles":["products/parties/@20250101/**/*"],"excludeFiles":[]},{"title":"SCA Exemptions API","description":"Maximize a frictionless checkout experience by using issuer data insights to apply exemptions.","includeFiles":["products/sca-exemptions/@v1/**/*"],"excludeFiles":[]},{"title":"Split Payments API","description":"Divide funds from a single payment amongst yourself and your parties/sellers.","includeFiles":["products/split-payments/@20250625/**/*"],"excludeFiles":[]},{"title":"Statements API","description":"Retrieve your account statement and see individual entries for all credits and debits.","includeFiles":["products/statements/@20250101/**/*"],"excludeFiles":[]},{"title":"Transfers API","description":"Transfer funds from source account to target account.","includeFiles":["products/transfers/@20250101/**/*"],"excludeFiles":[]},{"title":"Verified Tokens API","description":"Verified Tokens ensures that your customer's payment details are valid and CIT compliant when creating a token.","includeFiles":["products/verified-tokens/@v3/**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Last updated"]},": 30 October 2025 | ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/checkout/ios/changelog/"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Change log"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"card-validation","__idx":0},"children":["Card Validation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Validate your customer's card details before processing them."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The validation does not check if your customer's card details are correct. The validation only checks the format of the entered details."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"get-started","__idx":1},"children":["Get started"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["you have added the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AccessCheckoutSDK"]}," to your project as a Cocoapods dependency"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["you have added an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["import AccessCheckoutSDK"]}," at the top of your swift file"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The four basic components for this integration are:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your UITextField's for PAN, expiry date and CVC"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AccessCheckoutCardValidationDelegate"]}," is designed to receive events pertaining to validation"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An instance of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CardValidationConfig"]}," contains all the information required for the initialization of the validation flow, including references to the view components to enable validation for"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AccessCheckoutValidationInitialiser"]}," is responsible for initializing the validation flow"]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Full Sample Integration"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can see an example of the CVC validation integration ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/Worldpay/access-checkout-ios/tree/v2.4.1/AccessCheckoutDemo"},"children":["here"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"create-and-reference-the-ui-components","__idx":2},"children":["Create and reference the UI components"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To display your checkout form, you must create your layout first using your storyboard."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here's an example of how you would reference your UI components using unique identifiers."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"import AccessCheckoutSDK\n\nclass ViewController: UIViewController {\n\n    @IBOutlet weak var panTextField: UITextField!\n    @IBOutlet weak var expiryDateTextField: UITextField!\n    @IBOutlet weak var cvcTextField: UITextField!\n    ...\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"implement-the-accesscheckoutcardvalidationdelegate-protocol","__idx":3},"children":["Implement the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AccessCheckoutCardValidationDelegate"]}," protocol"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This ensures you are notified of validation events and card brand changes on customer input."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here's an example."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"extension ViewController: AccessCheckoutCardValidationDelegate {\n\n    // This event handler is notified when the card brand detected by the SDK has changed\n    func cardBrandChanged(cardBrand: CardBrand?) {\n        // This piece of code updates in the UI a card image displayed in a UIImageView next to the PAN\n        // A cardBrand contains a name and an array of images objects.\n        // Each image object has a URL and a type (either image/png or image/svg+xml) and represents the same brand \n        if let imageUrl = cardBrand?.images.filter({ $0.type == \"image/png\" }).first?.url, let url = URL(string: imageUrl) {\n            DispatchQueue.global(qos: .userInteractive).async {\n                if let data = try? Data(contentsOf: url) {\n                    DispatchQueue.main.async {\n                        self.imageView.image = UIImage(data: data)\n                    }\n                }\n            }\n        } else {\n            // This occurs when the SDK has not been able to identify the card brand from the PAN entered by the customer\n            self.imageView.image = ...\n        }\n    }\n\n    // This event handler is notified when the PAN becomes valid or invalid\n    func panValidChanged(isValid: Bool) {\n        // You might want to change the text color\n        panTextField.textColor = isValid ? nil : UIColor.red\n        \n        if !valid {\n            // You might want to disable a submit button which would normally be clicked on when all fields are valid\n            submitButton.isEnabled = false\n        }\n    }\n\n    // This event handler is notified when the CVC becomes valid or invalid\n    func cvcValidChanged(isValid: Bool) {\n        // You might want to change the text color\n        cvcTextField.textColor = isValid ? nil : UIColor.red\n        \n        if !valid {\n            // You might want to disable a submit button which would normally be clicked on when all fields are valid\n            submitButton.isEnabled = false\n        }\n    }\n\n    // This event handler is notified when the expiry date becomes valid or invalid\n    func expiryDateValidChanged(isValid: Bool) {\n        // You might want to change the text color\n        expiryDateTextField.textColor = isValid ? nil : UIColor.red\n        \n        if !valid {\n            // You might want to disable a submit button which would normally be clicked on when all fields are valid\n            submitButton.isEnabled = false\n        }\n    }\n\n    // This event handler is notified when the PAN, expiry date and CVC are all valid\n    func validationSuccess() {\n        // You might want to enable a submit button when all fields are valid\n        submitButton.isEnabled = true\n    }\n}\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"instantiate-a-cardvalidationconfig-and-initialize-the-validation","__idx":4},"children":["Instantiate a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CardValidationConfig"]}," and initialize the validation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["We highly recommend to do this in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["viewDidLoad()"]}," handler of your UIViewController. This is because the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AccessCheckoutValidationInitialiser"]}," asynchronously requests a file containing validation configuration."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"override func viewDidLoad() {\n    ...\n    let validationConfig = try! CardValidationConfig.builder()\n        .pan(panTextField)\n        .expiryDate(expiryDateTextField)\n        .cvc(cvcTextField()\n        .accessBaseUrl(<ACCESS_BASE_URL>)\n        .validationDelegate(self)\n        .build()\n    \n    AccessCheckoutValidationInitialiser().initialise(validationConfig)\n}\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Placeholder"},"children":["Placeholder"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Descriptions"},"children":["Descriptions"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<ACCESS_BASE_URL>"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["For testing use: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://try.access.worldpay.com/"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["For live use: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://access.worldpay.com/"]}]}]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"card-validation-rules","__idx":5},"children":["Card validation rules"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The validation logic in the SDK, is based off a set of default rules for any card type. Specific brand rules are fetched from a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CardTypes"]}," JSON file, which holds the validation rules and card brand logos for each brand. The icons are available in both ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SVG"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PNG"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"validation-rules","__idx":6},"children":["Validation rules"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The table below shows the rules that our SDK uses to validate your customer's card details."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Card Name"},"children":["Card Name"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"BIN Range"},"children":["BIN Range"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"PAN Length"},"children":["PAN Length"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"CVC Length"},"children":["CVC Length"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Amex"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["34, 37"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["15"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["4"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Diners"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["300-305, 3095, 36, 38, 39"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["14, 16, 19"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Discover"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["6011, 644 - 649, 65"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["16, 19"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["JCB"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["2131, 1800, 3088 - 3094, 3096 - 3102, 3112 - 3120, 3158 - 3159, 3337 - 3349, 3528 - 3589"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["16, 17, 18, 19"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Maestro"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["493698, 500000 - 506698, 506779 - 508999, 56 - 59, 63, 67, 6"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["12, 13, 14, 15, 16, 17, 18, 19"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["MasterCard"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["51 - 55, 2221 - 2229, 223 - 229, 23 - 26, 270 - 271, 2720: optimized using 22 - 27"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["16"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Visa"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["4"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["13, 16, 18, 19"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"card-brand-restriction","__idx":7},"children":["Card brand restriction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The SDK enables you to optionally provide a list of card brands that you support. This means that if you do not support a certain card brand, the SDK notifies your code of an invalid PAN if an unsupported brand is recognized."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["By default, the SDK allows cards from any brand. If you do not wish to restrict the card brands that you accept then you do not need to pass any configuration."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"example-configuration","__idx":8},"children":["Example Configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To restrict the card brands that you accept, simply pass in an array of the brands that you ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["do"]}," wish to accept when initializing the SDK."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following validation configuration restricts the SDK to accept only American Express, Visa or Mastercard BIN ranges."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"let validationConfig = try! CardValidationConfig.builder()\n    ...\n    .acceptedCardBrands([\"visa\", \"mastercard\", \"AMEX\"])\n    ...\n    .build()\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"currently-supported-card-brands","__idx":9},"children":["Currently supported card brands"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The SDK is able to recognize the following card brands:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Brand"},"children":["Brand"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Code"},"children":["Code"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["American Express"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"amex\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Diners"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"diners\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Discover"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"discover\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["JCB"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"jcb\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Maestro"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"maestro\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Mastercard"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"mastercard\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Visa"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"visa\""]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the SDK does not recognize a PAN as one of the above brands, it will be permitted as long as it meets the usual criteria for a valid PAN."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"pan-formatting","__idx":10},"children":["PAN formatting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The SDK allows PAN formatting as the customer types. This feature is disabled by default."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The PAN is formatted in the following way:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Card Type"},"children":["Card Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Formatting"},"children":["Formatting"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Visa, Mastercard, JCB, Discover, Diners, Maestro"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["XXXX XXXX XXXX XXXX"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Amex"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["XXXX XXXXXX XXXXX"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"enabling-pan-formatting","__idx":11},"children":["Enabling PAN formatting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To enable the PAN formatting behavior, simply call the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enablePanFormatting"]}," method on the builder."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"let validationConfig = try! CardValidationConfig.builder()\n    ...\n    .enablePanFormatting()\n    ...\n    .build()\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-sessions","__idx":12},"children":["Create session(s)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once validation is in place you can request ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sessions"]}," to implement your payment flow."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Next steps"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/checkout/ios/v2/card-only"},"children":["Create a session to pay with a card"]}," or ",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/checkout/ios/v2/card-and-cvc"},"children":["Create sessions to pay with a card and cvc"]}]}]},"headings":[{"value":"Card Validation","id":"card-validation","depth":1},{"value":"Get started","id":"get-started","depth":2},{"value":"Create and reference the UI components","id":"create-and-reference-the-ui-components","depth":2},{"value":"Implement the AccessCheckoutCardValidationDelegate protocol","id":"implement-the-accesscheckoutcardvalidationdelegate-protocol","depth":2},{"value":"Instantiate a CardValidationConfig and initialize the validation","id":"instantiate-a-cardvalidationconfig-and-initialize-the-validation","depth":2},{"value":"Card validation rules","id":"card-validation-rules","depth":4},{"value":"Validation rules","id":"validation-rules","depth":4},{"value":"Card brand restriction","id":"card-brand-restriction","depth":2},{"value":"Example Configuration","id":"example-configuration","depth":4},{"value":"Currently supported card brands","id":"currently-supported-card-brands","depth":4},{"value":"PAN formatting","id":"pan-formatting","depth":2},{"value":"Enabling PAN formatting","id":"enabling-pan-formatting","depth":4},{"value":"Create session(s)","id":"create-sessions","depth":3}],"frontmatter":{"seo":{"title":"Card Validation"}},"lastModified":"2025-11-26T14:54:42.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/checkout/ios/v2/card-validator","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}