Stripe | Financial Infrastructure to Grow Your Revenue

Stripe | Financial Infrastructure to Grow Your Revenue

4466 articles

Send payouts to Apple Pay


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 statusError codeCondition
400apple_pay_pk_token_requiredtype is apple_pay, but payout_method_data.apple_pay.pk_token is missing.
400apple_pay_invalid_formatpk_token is formatted incorrectly. Make sure you’re passing unmodified paymentToken.paymentData from Apple’s API.
400apple_pay_no_signing_keyStripe can’t decrypt pk_token. Make sure your Apple Pay Payment Processing Certificate is registered with Stripe.
400apple_pay_payment_decryptionStripe 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.

See also

Last verified 2026-09-24

Is this helpful?