ApplePaySession.applePayCapabilities() started returning applePayUnsupported in third-party browsers

We rely on ApplePaySession.applePayCapabilities() to decide whether to show the Apple Pay button. We use two different merchant IDs for non-prod/prod environments, and encountered a change in behavior where this API now returns different results.

These merchant IDs are generated from a third-party provider Adyen. However, Adyen has informed us that they are unable to identify the root cause of the issue and advised us to seek assistance directly from Apple Pay support.

Timeline

  • Last known working date: 13/08/2025
  • Issue first noticed: 18/08/2025

Environment Details

  • Apple Pay JS API version 1.latest
  • Browsers Tested: Third party browsers including Chrome/139.0.0.0, Firefox/141.0
    • Browsers with ApplePaySession built-in (like iOS Chrome, iOS Safari, and macOS Safari) are working fine
  • Framework Stack: Angular v18.1.3
  • (important) no configuration setup in Apple dev account, merchantId is generated from a third-party provider Adyen.

Current Execution Flow:

  1. Apple Pay JS API script element is injected
<script type="text/javascript" async="" src="https://applepay.cdn-apple.com/jsapi/1.latest/apple-pay-sdk.js"></script>
  1. Triggers below to check apple pay readiness, different ${merchantId_credential} is used:
await window.ApplePaySession.applePayCapabilities(`${merchantId_credential}`);

(**ApplePaySession is a valid object at this point)

  1. Observed that different paymentCredentialStatus is returned
// nonprod env
{
    "paymentCredentialStatus": "applePayUnsupported" // unexpected
}
 
// prod env
{
    "paymentCredentialStatus": "paymentCredentialStatusUnknown"
}

The same code is executed in each environment and the behaviour was also the same, but has changed since then.

Side notes

By checking the SDK’s internal code, we saw that in third-party browsers it makes an extra call to the following endpoint. Responses from this call also come back differently depending on the merchantId.

When invoking below:

curl -X POST \
  https://smp-paymentservices.apple.com/paymentservices/v3/checkStatus/merchant/{merchantId} \
  -H 'Content-Type: application/json' \
  -d '{
    "initiative": "web",
    "initiativeContext": "env_specific_domain"
  }'

Our non-prod environment returns {"registered":false} while using prod's merchantId and domain it returns {"registered":true}. We thought the issue might be domain-related since the environments are on different domains, but so far, no luck.


The main questions we're looking to resolve are:

  1. Why did the behavior change at a certain point despite no code changes? How should we approach this investigation, and what specific requests should we be making to the Adyen team?
  2. Why does the response from the call to https://smp-paymentservices.apple.com/paymentservices/v3/checkStatus/merchant/{merchantId} return different results? Perhaps this could provide a clue regarding the question above?
  3. We noticed that canMakePayments() is returning true, so we could consider using that as a workaround. Would it be safe to change the source of truth relying on canMakePayments() for displaying Apple Pay?

There is a concern that this issue may also occur in our production environment, so we would appreciate assistance in understanding what is happening and finding a resolution.

Hi! Sorry to hear there's some difficulties getting this API to work.

I don't think we can provide a solution without knowing some more details. In particular, we would need to know the merchant IDs you're using to determine exactly what is going wrong.

Please don't post your merchant IDs in this thread, but instead send them to us directly. I'd recommend filing a bug report through Feedback Assistant. More information on how to do this can be found at https://developer.apple.com/bug-reporting/

As part of that report, it would be very useful for you to:

  • Provide a link to this forum post, so we can refer to the original information you provided.
  • The Merchant IDs for both your prod and non-prod environments.
  • Any other information you wish to share directly that you think may be useful, which you don't wish to post publicly on the forum.

Once you've filed a report, you'll receive a Feedback Assistant ID (it will have the prefix "FB"). You can post that ID here to make me aware it has been filed, and we will take a look and work with you directly.

In answer to your questions:

1 & 2: We would need to investigate further based on the information you share through Feedback Assistant, and can't provide an answer right now.

3: It depends on how you're presenting the Apple Pay button. Whilst canMakePayments will provide a high level signal of Apple Pay availability, applePayCapabilities provides a more granular response than just a boolean. It provides the most appropriate information across all supported browsers (Safari + 3rd Party), and allows for optimisation on how Apple Pay is presented in your checkout flow/product detail page. More information on the best way to check for availability can be found here.

I hope that helps in the meantime, and I'll monitor this thread for the Feedback Assistant ID so we can look into this further.

ApplePaySession.applePayCapabilities() started returning applePayUnsupported in third-party browsers
 
 
Q