Private preview
Send payouts to Apple Pay Private preview
Send instant USD payouts to a debit card in your recipient's Apple Wallet.
Use Apple Pay payouts to:
- Offer one-tap payouts : Your recipient taps the Apple Pay button, selects a debit card from their wallet, and confirms with Face ID or Touch ID. They don’t need to manually enter or re-enter card numbers. After the first authorization, Stripe saves the card as a reusable payout method for future payouts.
- Reuse your existing payout integration : After Stripe creates the Apple Pay payout method, sending a payout to it uses the same OutboundPayments API call you already use for other payout methods.
Sending Apple Pay payouts is in private preview. If you’re interested, request access.
Note
This private preview supports USD payouts to debit cards in the US only.
How it works
Your app presents an Apple Pay disbursement sheet using Apple’s PassKit SDK on iOS or Apple’s Disbursements API on the web. After your recipient selects a debit card and authenticates, your app receives an encrypted Apple Pay payment token. Stripe only needs two fields from that token:
- The paymentData property ( PKPaymentToken. paymentData on iOS, or ApplePayPaymentToken. paymentData on the web)
- The displayName property ( PKPaymentToken. paymentMethod. displayName on iOS, or ApplePayPaymentToken. paymentMethod. displayName on the web)
Send both values to your server, which calls Stripe to register the card as a payout method and then sends the payout.
Create an Apple Pay payout method
Note
Apple Cash isn’t supported as a payout method.
Post the paymentData and displayName values to the OutboundSetupIntents API with payout_method_data.type set to apple_pay. The Stripe-Context header in this request must be the recipient’s Account ID. On iOS, PKPaymentToken.paymentData is a Data instance, so base64-encode it before sending it as pk_token. displayName is already a string.
Command Line
Stripe decrypts the token and returns a reusable PayoutMethod with available_payout_speeds set to instant and an apple_pay hash containing the card’s dynamic_last4, last4, exp_month, exp_year, and supported_currencies. dynamic_last4 is the last four digits of the device PAN (the related setting), which Stripe retrieves from the decrypted Apple Pay token. last4 is the last four digits of the real card number (PAN), which Stripe extracts from paymentMethod.displayName.
Apple Pay error codes
| HTTP status | Error code | Condition |
|---|---|---|
| 400 | apple_pay_pk_token_required | type is apple_pay, but payout_method_data.apple_pay.pk_token is missing. |
| 400 | apple_pay_invalid_format | pk_token is formatted incorrectly. Make sure you’re passing unmodified paymentToken.paymentData from Apple’s API. |
| 400 | apple_pay_no_signing_key | Stripe can’t decrypt pk_token. Make sure your Apple Pay Payment Processing Certificate is registered with Stripe. |
| 400 | apple_pay_payment_decryption | Stripe encountered a problem decrypting pk_token. Verify the token wasn’t modified, and try again. |
Send a payout
After the Apple Pay payout method exists, send payouts to it the same way you send money to any other payout method: set to.payout_method on your OutboundPayment to the payout_method.id returned from the previous step. The Apple Pay payout method is reusable across payouts.
Manage the Apple Pay payout method
The Apple Pay payout method is retrievable, listable, archivable, and unarchivable through the Payout Methods API, alongside your recipient’s other payout method types (bank account, card, and so on). The Stripe-Context header in this request must be the recipient’s Account ID.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Integrate with Apple Pay
This requires iOS 17 or later. For devices on earlier versions, fall back to your existing debit card entry flow.
Enroll in the Apple Developer Program and complete the merchant ID, certificate, and Xcode setup described in Set up Stripe through Integrate with Xcode. No Stripe iOS SDK is required for the client side.
Check for disbursement support
Import PassKit and use PKPaymentAuthorizationController.supportsDisbursements() to confirm the device can process disbursements before showing the Apple Pay button.
DisbursementController.swift
import PassKit
@available(iOS 17.0, *)
class DisbursementController: UIViewController, PKPaymentAuthorizationControllerDelegate {
let applePayButton = PKPaymentButton(paymentButtonType: .plain, paymentButtonStyle: .black)
override func viewDidLoad() {
super.viewDidLoad()
applePayButton.addTarget(self, action: #selector(handleApplePayButtonTapped), for: .touchUpInside)
if !PKPaymentAuthorizationController.supportsDisbursements() {
applePayButton.isEnabled = false
// Show a fallback UI
}
}
}
Build and present the disbursement request
You can set the instantFundsOut merchant capability so Apple only shows cards eligible for the Stripe instant-only push-to-card payouts. This capability requires a PKInstantFundsOutFeeSummaryItem in summaryItems, set to 0 USD if you don’t charge a fee. The summaryItems array has a strict order: a PKPaymentSummaryItem, then the PKInstantFundsOutFeeSummaryItem, then a PKDisbursementSummaryItem representing the total.
DisbursementController.swift
@objc func handleApplePayButtonTapped() {
guard PKPaymentAuthorizationController.supportsDisbursements() else {
// Hide the button or show a fallback
return
}
let request = PKDisbursementRequest(
merchantIdentifier: "merchant.com.your_app_name",
currency: "USD",
region: "US",
supportedNetworks: [.visa, .masterCard],
merchantCapabilities: [.threeDSecure, .instantFundsOut],
summaryItems: [
PKPaymentSummaryItem(label: "Payout", amount: NSDecimalNumber(string: "1.00")),
PKInstantFundsOutFeeSummaryItem(label: "Instant Transfer Fee", amount: NSDecimalNumber(string: "0.00")),
PKDisbursementSummaryItem(label: "Payout", amount: NSDecimalNumber(string: "1.00")),
]
)
let controller = PKPaymentAuthorizationController(disbursementRequest: request)
controller.delegate = self
controller.present { presented in
if !presented {
// Device couldn't present the sheet, show a fallback
}
}
}
Refer to Apple’s documentation for full guidance on customizing the request.
Handle the response and call Stripe
Implement PKPaymentAuthorizationControllerDelegate to receive the PKPayment token and send it to your server, which calls the OutboundSetupIntents API and then the OutboundPayments API using the recipient’s Account ID.
DisbursementController.swift
func paymentAuthorizationController(
_ controller: PKPaymentAuthorizationController,
didAuthorizePayment payment: PKPayment,
handler completion: @escaping (PKPaymentAuthorizationResult) -> Void
) {
let paymentDataB64 = payment.token.paymentData.base64EncodedString()
MyServer.createPayout(
pkToken: paymentDataB64,
pkTokenDisplayName: payment.token.paymentMethod.displayName,
recipientAccountId: "acct_xxx"
) { result in
switch result {
case .success:
completion(PKPaymentAuthorizationResult(status: .success, errors: nil))
case .failure:
completion(PKPaymentAuthorizationResult(status: .failure, errors: nil))
}
}
}
func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
controller.dismiss { }
}
Note
Stripe doesn’t provide iOS SDK helpers for disbursements because PassKit already covers request preparation. Stripe decrypts the Apple Pay token, which is in PCI scope, on the back end.
Query the Payout Methods API to display a recipient’s existing Apple Pay payout methods alongside the button on your withdrawal screen, so they can reuse a previously linked card without going through the Apple Pay sheet again.
Request access
Interested in sending payouts to Apple Pay?
Enter your email to request access.
