The Adyen Issuing SDK enables iOS apps to integrate with Adyen's card issuing platform. It provides end-to-end encrypted card detail retrieval, PIN management, and Apple Wallet provisioning, all without sensitive data ever touching your server.
- Card reveal — securely display PAN, CVC, and expiry date in your app
- PIN reveal & change — let cardholders view or update their PIN
- Apple Wallet provisioning — add cards to Apple Pay from within your app
- Wallet Extensions — support in-app provisioning and Issuer Extensions for the Apple Wallet app
| Module | Description |
|---|---|
Card |
Low-level card services (CardRevealService, PinRevealService, PinChangeService) |
CardSessions |
Card reveal (PAN, CVC, expiry), PIN reveal, and PIN change |
CardProvisioningSessions |
Apple Wallet provisioning sessions and Wallet Extension handlers |
IssuingCommon |
Shared types (TokenProviding, SessionEnvironment, SessionToken) |
Note:
CardProvisioningandCardProvisioningExtensionare legacy modules. New integrations should useCardProvisioningSessions. Most apps should useCardSessionsrather thanCarddirectly.
- iOS 16.0+
- Swift 5.9+
- Xcode 16+
- An Adyen Issuing integration on your backend
- An app certificate issued by Adyen (
.derformat) - App Attest entitlement (
com.apple.developer.devicecheck.appattest-environment)
Add the SDK to your project using Swift Package Manager:
dependencies: [
.package(url: "https://github.com/Adyen/adyen-issuing-ios", from: "1.0.0")
]Then add the products you need to your target:
.target(
name: "YourApp",
dependencies: [
.product(name: "CardSessions", package: "adyen-issuing-ios"),
.product(name: "CardProvisioningSessions", package: "adyen-issuing-ios"),
.product(name: "IssuingCommon", package: "adyen-issuing-ios"),
]
)All sessions require a TokenProviding implementation that fetches short-lived session tokens from your backend:
import IssuingCommon
struct MyTokenProvider: TokenProviding {
func retrieveToken(for paymentInstrumentIds: Set<String>) async throws -> SessionToken {
let raw = try await myBackend.fetchToken(for: paymentInstrumentIds)
return SessionToken(raw)
}
}import CardSessions
import IssuingCommon
let session = CardSession(
parameters: .init(appCertificate: certificate, environment: .live),
tokenProvider: myTokenProvider
)
let details = try await session.revealCardDetails(paymentInstrumentId: "PI123...")
// details.pan, details.cvc, details.expiryMonth, details.expiryYearimport CardProvisioningSessions
import IssuingCommon
let session = try ProvisioningSession(
parameters: .init(
appCertificate: certificate,
paymentInstrumentIds: ["PI123..."],
keychainAccessGroup: "TEAM_ID.group.com.example.app",
environment: .live
),
tokenProvider: myTokenProvider
)
try await session.configure()
let state = await session.provisioningState(for: "PI123...")
switch state {
case .canProvision:
// Show "Add to Apple Wallet" button
let result = try await session.provision(paymentInstrumentId: "PI123...", viewController: self)
case .provisioned:
// Card is already in Apple Wallet
break
case .cannotProvision(let reason):
// Handle reason (.notConfigured, .cannotAddCard, etc.)
break
}Full API reference and integration guides are available at:
adyen.github.io/adyen-issuing-ios
If you have a feature request, or spotted a bug or a technical problem, create an issue here.
For other questions, contact our support team.
This SDK is available under the MIT license. See the LICENSE file for more info.