Create Apple Pay token | Moov Documentation
Create Apple Pay token
Connect an Apple Pay token to the specified account.
Read our Apple Pay tutorial to learn more. The token data is defined by Apple Pay and should be passed through from Apple Pay's response unmodified.
To access this endpoint using an access token you'll need to specify the /accounts/{accountID}/cards.write scope.
Request
POST
/accounts/{accountID}/apple-pay/tokens
Shell Example
curl -X POST "https://api.moov.io/accounts/{accountID}/apple-pay/tokens" \
-H "Authorization: Bearer {token}" \
-H "X-Moov-Version: v2026.04.00" \
-d '{
"token": {
"paymentData": {
"version": "EC_v1",
"data": "3+f4oOTwPa6f1UZ6tG...CE=",
"signature": "MIAGCSqGSIb3DQ.AAAA==",
"header": {
"publicKeyHash": "l0CnXdMv...D1I=",
"transactionId": "32b...4f3"
}
},
"paymentMethod": {
"displayName": "Visa 1234",
"network": "Visa",
"type": "debit"
},
"transactionIdentifier": "32b...4f3"
}
}'
Go Example
mc, _ := moov.NewClient()
var accountID string
address := moov.ApplePayBillingContact{
AddressLines: []string{
"123 Sesame Street",
},
Locality: "Phoenix",
PostalCode: "30345",
AdministrativeArea: "AZ",
CountryCode: "US",
}
token := moov.ApplePayToken{
PaymentData: moov.ApplePaymentData{
Version: "EC_v1",
Data: "3+f4oOTwPa6f1UZ6tG...CE=",
Signature: "MIAGCSqGSIb3DQ.AAAA==",
Header: moov.ApplePaymentDataHeader{
EphemeralPublicKey: "MFkwEK...Md==",
PublicKeyHash: "l0CnXdMv...D1I=",
TransactionId: "32b...4f3",
},
},
PaymentMethod: moov.ApplePaymentMethod{
DisplayName: "Visa 1234",
Network: "Visa",
Type: "debit",
},
TransactionIdentifier: "32b...4f3",
}
mc.LinkApplePayToken(ctx, accountID,
moov.LinkApplePay{
Token: token,
BillingContact: address,
})
TypeScript Example
import { Moov } from "@moovio/sdk";
const moov = new Moov({
security: {
username: "",
password: "",
},
});
async function run() {
const result = await moov.applePay.linkToken({
accountID: "bf498c07-3852-4060-b561-bf992e26a851",
linkApplePay: {
token: {
paymentData: {
version: "EC_v1",
data: "3+f4oOTwPa6f1UZ6tG...CE=",
signature: "MIAGCSqGSIb3DQ.AAAA==",
header: {
ephemeralPublicKey: "MFkwEK...Md==",
publicKeyHash: "l0CnXdMv...D1I=",
transactionId: "32b...4f3",
},
},
paymentMethod: {
displayName: "Visa 1234",
network: "Visa",
type: "debit",
},
transactionIdentifier: "32b...4f3",
},
billingContact: {
addressLines: [
"123 Sesame Street",
],
locality: "Phoenix",
postalCode: "30345",
administrativeArea: "AZ",
countryCode: "US",
},
},
});
console.log(result);
}
run();
PHP Example
declare(strict_types=1);
require 'vendor/autoload.php';
use Moov o;
use Moov o oModels;
$sdk = MoovPhp o::builder()
->setSecurity(
new Components oSecurity(
username: '',
password: '',
)
)
->build();
$linkApplePay = new Components oLinkApplePay(
token: new Components oLinkApplePayToken(
paymentData: new Components oLinkApplePaymentData(
version: 'EC_v1',
data: '3+f4oOTwPa6f1UZ6tG...CE=',
signature: 'MIAGCSqGSIb3DQ.AAAA==',
header: new Components oApplePayHeader(
ephemeralPublicKey: 'MFkwEK...Md==',
publicKeyHash: 'l0CnXdMv...D1I=',
transactionId: '32b...4f3',
),
),
paymentMethod: new Components oLinkApplePaymentMethod(
displayName: 'Visa 1234',
network: 'Visa',
type: 'debit',
),
transactionIdentifier: '32b...4f3',
),
billingContact: new Components oAppleBillingContact(
addressLines: [
'123 Sesame Street',
],
locality: 'Phoenix',
postalCode: '30345',
administrativeArea: 'AZ',
countryCode: 'US',
),
);
$response = $sdk->applePay->linkToken(
accountID: 'bf498c07-3852-4060-b561-bf992e26a851',
linkApplePay: $linkApplePay
);
if ($response->linkedApplePayPaymentMethods !== null) {
// handle response
}
Java Example
package hello.world;
import io.moov.sdk.Moov;
import io.moov.sdk.models.components.*;
import io.moov.sdk.models.errors.GenericError;
import io.moov.sdk.models.errors.LinkApplePayError;
import io.moov.sdk.models.operations.LinkApplePayTokenResponse;
import java.lang.Exception;
import java.util.List;
public class Application {
public static void main(String[] args) throws GenericError, LinkApplePayError, Exception {
Moov sdk = Moov.builder()
.security(Security.builder()
.username("")
.password("")
.build())
.build();
LinkApplePayTokenResponse res = sdk.applePay().linkToken()
.accountID("bf498c07-3852-4060-b561-bf992e26a851")
.linkApplePay(LinkApplePay.builder()
.token(LinkApplePayToken.builder()
.paymentData(LinkApplePaymentData.builder()
.version("EC_v1")
.data("3+f4oOTwPa6f1UZ6tG...CE=")
.signature("MIAGCSqGSIb3DQ.AAAA==")
.header(ApplePayHeader.builder()
.publicKeyHash("l0CnXdMv...D1I=")
.transactionId("32b...4f3")
.ephemeralPublicKey("MFkwEK...Md==")
.build())
.build())
.paymentMethod(LinkApplePaymentMethod.builder()
.displayName("Visa 1234")
.network("Visa")
.type("debit")
.build())
.transactionIdentifier("32b...4f3")
.build())
.billingContact(AppleBillingContact.builder()
.addressLines(List.of(
"123 Sesame Street"))
.locality("Phoenix")
.postalCode("30345")
.administrativeArea("AZ")
.countryCode("US")
.build())
.build())
.call();
if (res.linkedApplePayPaymentMethods().isPresent()) {
System.out.println(res.linkedApplePayPaymentMethods().get());
}
}
}
Python Example
from moovio_sdk import Moov
from moovio_sdk.models import components
with Moov(
security=components.Security(
username="",
password="",
),
) as moov:
res = moov.apple_pay.link_token(account_id="bf498c07-3852-4060-b561-bf992e26a851", token={
"payment_data": {
"version": "EC_v1",
"data": "3+f4oOTwPa6f1UZ6tG...CE=",
"signature": "MIAGCSqGSIb3DQ.AAAA==",
"header": {
"ephemeral_public_key": "MFkwEK...Md==",
"public_key_hash": "l0CnXdMv...D1I=",
"transaction_id": "32b...4f3",
},
},
"payment_method": {
"display_name": "Visa 1234",
"network": "Visa",
"type": "debit",
},
"transaction_identifier": "32b...4f3",
}, billing_contact={
"address_lines": [
"123 Sesame Street",
],
"locality": "Phoenix",
"postal_code": "30345",
"administrative_area": "AZ",
"country_code": "US",
})
# Handle response
print(res)
Ruby Example
require 'moov_ruby'
Models = ::Moov::Models
s = ::Moov::Client.new(
security: Models::Components::Security.new(
username: '',
password: ''
)
)
res = s.apple_pay.link_token(account_id: 'bf498c07-3852-4060-b561-bf992e26a851', link_apple_pay: Models::Components::LinkApplePay.new(
token: Models::Components::LinkApplePayToken.new(
payment_data: Models::Components::LinkApplePaymentData.new(
version: 'EC_v1',
data: '3+f4oOTwPa6f1UZ6tG...CE=',
signature: 'MIAGCSqGSIb3DQ.AAAA==',
header: Models::Components::ApplePayHeader.new(
ephemeral_public_key: 'MFkwEK...Md==',
public_key_hash: 'l0CnXdMv...D1I=',
transaction_id: '32b...4f3'
)
),
payment_method: Models::Components::LinkApplePaymentMethod.new(
display_name: 'Visa 1234',
network: 'Visa',
type: 'debit'
),
transaction_identifier: '32b...4f3'
),
billing_contact: Models::Components::AppleBillingContact.new(
address_lines: [
'123 Sesame Street',
],
locality: 'Phoenix',
postal_code: '30345',
administrative_area: 'AZ',
country_code: 'US'
)
))
unless res.linked_apple_pay_payment_methods.nil?
# handle response
end
C# Example
using Moov.Sdk;
using Moov.Sdk.Models.Components;
using System.Collections.Generic;
var sdk = new MoovClient(security: new Security() {
Username = "",
Password = "",
});
var res = await sdk.ApplePay.LinkTokenAsync(
accountID: "bf498c07-3852-4060-b561-bf992e26a851",
body: new LinkApplePay() {
Token = new LinkApplePayToken() {
PaymentData = new LinkApplePaymentData() {
Version = "EC_v1",
Data = "3+f4oOTwPa6f1UZ6tG...CE=",
Signature = "MIAGCSqGSIb3DQ.AAAA==",
Header = new ApplePayHeader() {
EphemeralPublicKey = "MFkwEK...Md==",
PublicKeyHash = "l0CnXdMv...D1I=",
TransactionId = "32b...4f3",
},
},
PaymentMethod = new LinkApplePaymentMethod() {
DisplayName = "Visa 1234",
Network = "Visa",
Type = "debit",
},
TransactionIdentifier = "32b...4f3",
},
BillingContact = new AppleBillingContact() {
AddressLines = new List<string>() {
"123 Sesame Street",
},
Locality = "Phoenix",
PostalCode = "30345",
AdministrativeArea = "AZ",
CountryCode = "US",
},
}
);
// handle response
A unique identifier used to trace requests.
The server could not understand the request due to invalid syntax.
The request contained missing or expired authentication.
The user is not authorized to make the request.
The requested resource was not found.
The request conflicted with the current state of the target resource.
The request was well-formed, but the contents failed validation. Check the request for missing or invalid fields.
Request was refused due to rate limiting.
The request failed due to an unexpected error.
The request failed because a downstream service failed to respond.