Request an Apple Pay card payout
Last updated: April 17, 2024
Our Apple Pay card payout solution enables you to perform payouts to eligible cards with Apple Pay on the following platforms and minimum OS versions:
- iOS 17.0
- iPadOS 17.0
- Mac Catalyst 17.0
- visionOS 1.0
Note
Apple Pay card payouts performed using macOS or a browser are not supported.
Generally, to perform an Apple Pay card payout, you should:
- Configure Apple Pay. This step is only required once during your initial setup.
- Generate a Checkout.com card token using the Apple Pay token.
- Check the recipient card's eligibility to receive payouts.
- Check your sub-account balance to ensure you have sufficient funds to fund the transaction.
- Perform a direct funds disbursement, or money transfer.
- Check the outcome of the payout.
To perform payouts using Apple Pay, you must add your Apple merchant ID and generate your payment processing certificate.
Note
If you've previously configured Apple Pay as a payment method, you can skip to the next section.
In your Apple Developer account:
- Go to the Add Merchant IDs section.
- Select Merchant IDs, then Continue.
- Add a description for the ID. For example,
Merchant ID for sandbox environment
. - Enter a merchant ID name in the Identifier section. Use a descriptive name that matches the domain and environment you will use the ID in. For example,
merchant.com.mywebsite.sandbox
.
To make it easier to test your integration, create separate merchant IDs for your test and live environments.
Use the following endpoint to generate a certificate signing request.
You'll receive a .csr
file in the response. You'll need to upload this to your Apple Developer account in a later step.
For the full API specification, see the API reference.
post
https://api.checkout.com/applepay/signing-requests
1curl --location --request POST 'https://api.checkout.com/applepay/signing-requests' \2--header 'Authorization: Bearer pk_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
1{2"content": "--- --BEGIN CERTIFICATE REQUEST--- --MIIBSTCB8AIBADCBjzELMAkGA1UEBhMCR0IxDzANBgNVBAgMBkxvbmRvbjEPMA0GA1UEBwwGTG9uZG9uMRUwEwYDVQQKDAxDaGVja291dC5jb20xCzAJBgNVBA8MAklUMRUwEwYDVQQDDAxjaGVja291dC5jb20xIzAhBgkqhkiG9w0BCQEWFHN1cHBvcnRAY2hlY2tvdXQuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjiZ410yhHCkwa04OfrPb0e5bqt4FncefJwAbFpcqARTWefYZNvLyYkV68PmAKoO7cthfAFVfoVNqXBEGzjg1TAKBggqhkjOPQQDAgNIADBFAiAcgJLboQK3GBQX/K5ghNzbcw4mnVcVk/rUmkIxu0M28gIhALO01kH13CZzMkAhRhnkeCUPaP+IqUqQaDdZL8d5xgFc--- --END CERTIFICATE REQUEST--- --"3}
Sign in to your Apple Developer account:
- Go to the Merchant IDs list, and select the merchant ID you created in an earlier step.
- In the Apple Pay Payment Processing Certificate section, select Create Certificate.
- If you're prompted about processing in China, select No, then select Continue.
- Upload the
.csr
file you received in a previous step, then select Continue. - Select Download to retrieve your payment processing certificate. This will be a
.cer
file.
You must provide Checkout.com with the signed payment processing certificate.
Checkout.com uses the certificate to decrypt Apple Pay tokens and use them to generate Checkout.com card tokens. You can use the card tokens to request a payment or payout.
Before you upload the certificate, you should convert it to a base64-encoded string. In your terminal, run the following command:
1openssl x509 -inform der -in apple_pay.cer -out base64_converted.cer
Use the following endpoint to upload the base64-encoded payment processing certificate.
For the full API specification, see the API reference.
post
https://api.checkout.com/applepay/certificates
1curl --location --request POST 'https://api.sandbox.checkout.com/applepay/certificates' \2--header 'Authorization: Bearer pk_xxxxxxxxxxxxxxxxxxxxxxxxxx' \3--header 'Content-Type: application/json' \4--data-raw '{5"content": "MIIEfTCCBCOgAwIBAgIID/asezaWNycwCgYIKoZIzj0EAwIwgYAxNDAyBgNVBAMMK0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENBIC0gRzIxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0yMTA2MTExMzQ0MjVaFw0yMzA3MTExMzQ0MjRaMIGuMS0wKwYKCZImiZPyLGQBAQwdbWVyY2hhbnQuY29tLmNoZWNrb3V0LnNhbmRib3gxQzBBBgNVBAMMOkFwcGxlIFBheSBQYXltZW50IFByb2Nlc3Npbmc6bWVyY2hhbnQuY29tLmNoZWNrb3V0LnNhbmRib3gxEzARBgNVBAsMCkUzMlhCUUs0UTUxFjAUBgNVBAoMDUNoZWNrb3V0IEx0ZC4xCzAJBgNVBAYTAkdCMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsvyUM9D1cssldH+VPptEn4VAw/Q6ovJuHVlyBSRaPGLHFce04lCiT/xnXOWRkUxyCzQWKhfG2zo19u4s+evx7aOCAlUwggJRMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUhLaEzDqGYnIWWZToGqO9SN863wswRwYIKwYBBQUHAQEEOzA5MDcGCCsGAQUFBzABhitodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDA0LWFwcGxld3dkcmNhMjAxMIIBHQYDVR0gBIIBFDCCARAwggEMBgkqhkiG92NkBQEwgf4wgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wNgYIKwYBBQUHAgEWKmh0dHA6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5LzA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLmFwcGxlLmNvbS9hcHBsZXd3ZHJjYTIuY3JsMB0GA1UdDgQWBBRNhvr33NDuM4QxBZd16a+ACbHoEzAOBgNVHQ8BAf8EBAMCAygwTwYJKoZIhvdjZAYgBEIMQDdGRjg0REI5MDE5NkVGN0I5RTc4NDZEMjg4NzZCNkJGRDU2RjM4MDlCNzUyNjAzRDM4QzcxNUJFMTY2M0JENEMwCgYIKoZIzj0EAwIDSAAwRQIgTjywMwOrLX3TwDUrPn7yDGL/dhc+VNudv0uGBOWRyXACIQClFQFvgx+hfTwVdHt8klrswpgtZtbYjs74p9GYuc8Puw=="6}'
1{2"id": "aplc_hefptsiydvkexnzzb35zrlqgfq",3"public_key_hash": "tqYV+tmG9aMh+l/K6cicUnPqkb1gUiLjSTM9gEz6Nl0=",4"valid_from": "2021-01-01T17:32:28.000Z",5"valid_until": "2025-01-01T17:32:28.000Z"6}
When a customer authenticates a transaction with biometrics on Apple Pay, Apple generates a unique payment token for the session.
You can choose to do one of the following:
- Use the Apple Pay token to generate a Checkout.com card token.
- Decrypt the token yourself on your backend.
To generate a card token with Checkout.com, use the following endpoint:
post
https://api.checkout.com/tokens
1{2"type": "applepay",3"token_data": {4"version": "EC_v1",5"data": "t7GeajLB9skXB6QSWfEpPA4WPhDqB7ekdd+F7588arLzvebKp3P0TekUslSQ8nkuacUgLdks2IKyCm7U3OL/PEYLXE7w60VkQ8WE6FXs/cqHkwtSW9vkzZNDxSLDg9slgLYxAH2/iztdipPpyIYKl0Kb6Rn9rboF+lwgRxM1B3n84miApwF5Pxl8ZOOXGY6F+3DsDo7sMCUTaJK74DUJJcjIXrigtINWKW6RFa/4qmPEC/Y+syg04x7B99mbLQQzWFm7z6HfRmynPM9/GA0kbsqd/Kn5Mkqssfhn/m6LuNKsqEmbKi85FF6kip+F17LRawG48bF/lT8wj/QEuDY0G7t/ryOnGLtKteXmAf0oJnwkelIyfyj2KI8GChBuTJonGlXKr5klPE89/ycmkgDl+T6Ms7PhiNZpuGEE2QE=",6"signature": "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",7"header": {8"ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEX1ievoT8DRB8T5zGkhHZHeDr0oBmYEgsDSxyT0MD0IZ2Mpfjz2LdWq6LUwSH9EmxdPEzMunsZKWMyOr3K/zlsw==",9"publicKeyHash": "tqYV+tmG9aMh+l/K6cicUnPqkb1gUiLjSTM9gEz6Nl0=",10"transactionId": "3cee89679130a4b2617c76118a1c62fd400cd45b49dc0916d5b951b560cd17b4"11}12}13}
1{2"type": "applepay",3"token": "tok_ymu4qlccztkedmd6b7c3hcf6ae",4"expires_on": "2024-10-21T10:48:35Z",5"expiry_month": 1,6"expiry_year": 2025,7"scheme": "VISA",8"last4": "6222",9"bin": "481891",10"card_type": "DEBIT",11"card_category": "CONSUMER",12"issuer": "Test Bank",13"issuer_country": "GB",14"product_id": "F",15"product_type": "CLASSIC"16}
To be eligible to receive a payout, the issuing bank must have enabled Visa Direct or Mastercard Moneysend for the recipient card.
Information
You can use the supportsDisbursements()
method exposed by Apple's PassKit API to verify if the user's device supports disbursement requests. This will ensure that only relevant cards will be displayed on the payment sheet.
You can check whether a card is eligible for Visa Direct or Mastercard Moneysend by retrieving the card's metadata.
The API response will also inform you whether the issuing bank has enabled Fast Funds for the card. With Fast Funds, funds from payouts are made available to the recipient card within 30 minutes. If Fast Funds is not enabled, funds may take up to 48 hours to become available.
Note
There can be a delay in funding Fast Funds-enabled cards if the issuing bank or Checkout.com has to conduct additional sanction and anti-money laundering checks.
post
https://api.checkout.com/metadata/card
1{2"source": {3"type": "card",4"number": "4921817844445119"5},6"format": "card_payouts"7}
The response will return the card's level of eligibility for the various card payout types in the card_payouts
object. For each card payout type, the value will be one of the following:
fast_funds
– The card has Fast Funds enabled for this card payout type.standard
– The card is eligible for this card payout type, but does not have Fast Funds enabled.not_supported
– The card does not support this card payout type.unknown
– The card account or issuing bank details could not be found, or the card scheme does not know if the card is eligible for this card payout type or for payouts in the specified region.
1{2"bin": "481891",3"scheme": "visa",4"card_type": "DEBIT",5"card_category": "CONSUMER",6"currency": "GBP",7"issuer": "Test Bank",8"issuer_country": "GB",9"issuer_country_name": "United Kingdom",10"product_id": "F",11"product_type": "Visa Classic",12"card_payouts": {13"domestic_non_money_transfer": "standard",14"cross_border_non_money_transfer": "standard",15"domestic_money_transfer": "fast_funds",16"cross_border_money_transfer": "standard"17}18}
Before you perform a card payout, you should verify that you have sufficient funds in your sub-account to fund the transaction.
To check your sub-account balance, use the following endpoint and replace {id}
with your entity ID. Your entity ID will have the format ent_<UNIQUE_ID>
.
get
https://balances.checkout.com/balances/{id}?withCurrencyAccountId=true
1{2"data": [3{4"currency_account_id": "ca_ux6najg5mnqexjs2jezz6gwseu",5"descriptor": "Test account",6"holding_currency": "GBP",7"balances": {8"pending": 1000,9"available": 50000,10"payable": 0,11"collateral": 012}13}14]15}
If you have insufficient funds in your sub-account's Available balance to fund the transaction, you can top up your account balance.
A direct funds disbursement is a type of payout in which a merchant transfers money to either an individual or corporate cardholder.
Information
For more information on the PKDisbursementRequest
object from the PassKit API, see the Apple Developer documentation.
To perform a direct funds disbursement, your payment request must include the amount
to be paid out, with the value formatted according to the currency
you specify in the request.
You should also set the destination.type
field to one of the following:
id
– With thedestination.id
field set to the payment instrument IDtoken
– With thedestination.token
field set to the Checkout.com card token you generated in a previous stepnetwork_token
– With thedestination.token
field set to the decrypted Apple Pay token
post
https://api.checkout.com/payments
1{2"source": {3"type": "currency_account",4"id": "ca_ux6najg5mnqexjs2jezz6gwseu"5},6"destination": {7"type": "id",8"id": "src_nwd3m4in3hkuddfpjsaevunhdy",9"account_holder": {10"type": "individual",11"first_name": "Hannah",12"last_name": "Bret"13}14},15"amount": 5000,16"currency": "GBP",17"sender": {18"type": "individual",19"first_name": "Ali",20"last_name": "Farid",21"address": {22"address_line1": "123 High St.",23"city": "London",24"country": "GB"25},26"reference": "012345",27"reference_type": "other",28"source_of_funds": "debit"29},30"reference": "012345678901",31"instruction": {32"funds_transfer_type": "PP"33},34"processing_channel_id": "pc_vxt6yftthv4e5flqak6w2i7rim"35}
1{2"id": "pay_g7rpbnxfqyreraewiqvltp33ha",3"status": "Accepted",4"reference": "Direct funds disbursement",5"destination": {6"account_holder": {7"id": "src_nwd3m4in3hkuddfpjsaevunhdy"8}9},10"_links": {11"self": {12"href": "https://api.sandbox.checkout.com/payments/pay_pay_g7rpbnxfqyreraewiqvltp33ha"13}14}15}
Note
If you attempt a payout to an ineligible card, you'll receive a 422 Invalid data sent
error.
If you have insufficient funds in your sub-account's Available balance to fund the transaction, you'll receive a payment_declined
webhook and a 50003
response code. You can top up your account balance and attempt the payout again.
A money transfer is a type of payout in which an individual consumer sends funds to another consumer, or to another of their own accounts.
To perform a money transfer, your payment request must include the:
amount
to be paid out, with the value formatted according to thecurrency
you specify in the requestsender
object, containing the entity's details
You should also set the destination.type
field to one of the following:
id
– With thedestination.id
field set to the payment instrument IDtoken
– With thedestination.token
field set to the Checkout.com card token you generated in a previous stepnetwork_token
– With thedestination.token
field set to the decrypted Apple Pay token
post
https://api.checkout.com/payments
1{2"source": {3"type": "currency_account",4"id": "ca_ux6najg5mnqexjs2jezz6gwseu"5},6"destination": {7"type": "id",8"id": "src_nwd3m4in3hkuddfpjsaevunhdy",9"account_holder": {10"type": "individual",11"first_name": "Hannah",12"last_name": "Bret"13}14},15"amount": 5000,16"currency": "GBP",17"sender": {18"type": "individual",19"first_name": "Ali",20"last_name": "Farid",21"address": {22"address_line1": "123 High St.",23"city": "London",24"country": "GB"25},26"reference": "012345",27"reference_type": "other",28"source_of_funds": "debit"29},30"reference": "012345678901",31"instruction": {32"funds_transfer_type": "PP"33},34"processing_channel_id": "pc_vxt6yftthv4e5flqak6w2i7rim"35}
1{2"id": "pay_g7rpbnxfqyreraewiqvltp33ha",3"status": "Accepted",4"reference": "Money transfer",5"destination": {6"account_holder": {7"id": "src_nwd3m4in3hkuddfpjsaevunhdy"8}9},10"_links": {11"self": {12"href": "https://api.sandbox.checkout.com/payments/pay_g7rpbnxfqyreraewiqvltp33ha"13}14}15}
Note
If you attempt a payout to an ineligible card, you'll receive a 422 Invalid data sent
error.
If you have insufficient funds in your sub-account's Available balance to fund the transaction, you'll receive a payment_declined
webhook and a 50003
response code. You can top up your account balance and attempt the payout again.
If you've enabled webhook notifications, you'll be notified of the final outcome of the payout request through a webhook containing a response code.
If the card payout was successful, you'll receive a payment_approved
webhook with the following fields in the webhook body:
"response_code": "10000"
"response_summary": "Approved"
If the card payout was declined, you'll receive a payment_declined
webhook with the following fields in the webhook body:
response_code
– A five-digit code between50000 - 50399
response_summary
– A description of the decline reason
If the card payout was returned, you'll receive a payment_returned
webhook with the following fields in the webhook body:
response_code
– A five-digit code between50401 - 50599
response_summary
– A description of the return reason