Hello,
I'm encountering an issue when trying to use the subscriptionGroupLookups endpoint in the App Store Connect API.
Despite having the correct setup, I continue to receive a 404 NOT FOUND error when making requests to:
GET https://api.appstoreconnect.apple.com/v1/subscriptionGroupLookups
Here is the current state of my environment:
I am the Account Holder of the App Store Connect account
The App Store Connect API key has been successfully created
I have the correct Key ID, Issuer ID, and .p8 private key
I can authenticate and access the apps and subscriptionGroups endpoints
However, the subscriptionGroupLookups endpoint always returns:
{
"errors": [
{
"status": "404",
"code": "NOT_FOUND",
"title": "The specified resource does not exist"
}
]
}
I suspect that LookUp Keys (UUIDs) have not been assigned to our subscription groups, even though they were created and are active in App Store Connect.
There is no “Request Access” button visible under the Integrations tab (as mentioned in Apple support instructions), and my keys appear under “App Store Connect API” > “Keys” as active.
Questions:
How can I ensure that LookUp Keys are assigned to my subscription groups?
Is there a way to trigger this manually or via support?
Has anyone successfully resolved this?
Any advice or experience would be greatly appreciated.
Thank you!
StoreKit
RSS for tagSupport in-app purchases and interactions with the App Store using StoreKit.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Question on token testing in development:
Hello,
I'm developing a React Native application using StoreKit External Purchase. I'm having difficulties testing the transaction token retrieval in the development environment.
Specific questions:
Is it possible to test the transaction token retrieval in development/sandbox environment?
Is there a special testing mode for developers that would allow simulating token reception without going through the App Store?
Are there specific debugging tools to verify proper token reception?
Question on native implementation:
Regarding the native implementation of StoreKit External Purchase:
Is there detailed documentation on creating native modules for React Native that implement StoreKit External Purchase?
Can you confirm if the following approach is correct for native implementation:
Using NSClassFromString(@"ExternalPurchase")
Calling presentNoticeSheetWithURL:completion:
Retrieving the token in the completion block
Are there any code examples for complete native implementation?
Question on implementation validation:
For validating StoreKit External Purchase implementation:
How can we verify that our implementation is correct before App Store submission?
Are there validation tools or automated tests to check compliance?
What are common errors to avoid during implementation?
Question on best practices:
Regarding implementation best practices:
What's the best way to handle potential errors during token retrieval?
How to handle cases where the user cancels the transaction?
What are the recommended security checks for server-side token validation?
Question on documentation:
I'm looking for additional resources on StoreKit External Purchase:
Is there specific documentation for integration with frameworks like React Native?
Are there complete code examples for native implementation?
Where can I find information about testing and debugging best practices?
Additional technical question:
Technical implementation details:
What's the correct way to handle the ExternalPurchase class initialization in React Native native modules?
Are there specific requirements for the URL passed to presentNoticeSheetWithURL?
How should we handle the token in the completion block to ensure it's properly passed back to React Native?
Question on testing workflow:
Testing workflow questions:
What's the recommended testing workflow for External Purchase implementation?
How can we verify the token format and validity before production deployment?
Are there any tools or methods to simulate the complete purchase flow in development?
hi, when i test an in app purchase with my sandbox acount i get:
"ask permission. a request to buy ** will be sent to your parent or gardian
(environment: sandbox)"
When i made the sandbox account, i didnt see any option to set my age. What am i missing here, I dont seem to be able to fully test in app purchases since my sandbox accounts always defualt to this family sharing thing?
Thanks
Topic:
App & System Services
SubTopic:
StoreKit
According to the App Store Server API documentation
, https://developer.apple.com/documentation/appstoreserverapi/price
the price field "shows the total amount of the transaction for the quantity the customer purchased."
However, in actual transaction notifications and responses from App Store Server API,
the price field appears to represent the unit price, not the total price.
For consumable in-app purchases with quantity > 1,
the price field equals the unit price of a single item.
The total user payment is only correct after multiplying by the quantity.
When quantity > 1, the actual amount paid by the user only matches price × quantity,
which contradicts the documentation.
Please confirm whether the price field is intended to be:
The unit price of a single item (requiring multiplication by quantity), or
The total price including all quantities (as currently documented).
If the former is correct, please update the documentation to clarify that the value represents the unit price, not the total amount.
Topic:
App & System Services
SubTopic:
StoreKit
I enter the payment wall, there it takes more or less 3 to 4 minutes to show the plans, when I select the monthly plan the loader is shown and from there the pop up to make the purchase in sandbox does not appear, I have waited until a maximum of 50 minutes and it is not shown, I go back and close the app I do the same steps and I am still there, without showing the pop up.
Doing this same process in xcode, everything happens immediately without any interruption.
The tutorial only says a notification will be sent, but what happens next..? what should we do about the child account..? are we blocking them..? what happens on the child account?
https://developer.apple.com/documentation/storekit/testing-age-assurance-in-sandbox
I'm working on adding a single Non-Consumable In-App purchase to my app. Essentially a "try before you buy" type thing. Limited functionality unless the app is purchased.
I am currently testing this using Xcode and the Manage StoreKit Transactions window. So far most everything appears to be working except for declined pending transactions.
If I set Ask to Buy to Enabled, the Ask Permission (for parent or guardian) dialog appears. After pressing the Ask button, I see a transaction listed as Pending Approval. If I Approve the transaction, then my app is notified and all is well.
However, if I Decline the transaction then my app is not notified. Is that normal?
Also, how do I (i.e. the app) know that there is a pending transaction?
Topic:
App & System Services
SubTopic:
StoreKit
Can anyone advise on this? We distributed promotional trial codes for our app Ask Dolly. These 1-month free trials are set to renew and charge users in March 2026.
A segment of users redeemed the promo codes but never created accounts or opened the app. We don't have their contact information to notify them. Our CEO has directed us to prevent these inactive subscriptions from renewing to avoid charging users who never engaged with the service.
We've downloaded the Subscription and Offer Code Redemption reports from App Store Connect, but cannot map Apple's Subscriber IDs to our user database (we only store Transaction IDs). This prevents us from identifying which specific subscriptions to cancel.
What We Need: Assistance preventing renewals for promotional subscriptions where users have had zero app sessions/opens as of the end of February.
These trials will start to renew on March 3, 2026. We need to resolve this before then to avoid charging inactive users.
Can you help us either:
Cancel subscriptions associated with promo codes that show zero app engagement, or
Provide guidance on how to programmatically identify and cancel these subscriptions?
Topic:
App & System Services
SubTopic:
StoreKit
I set up a sandbox account to test in-app purchases in my development app. I went to settings > dev > sandbox accounts and updated my login in the app store. But I received a 'block'; I can no longer download new versions or anything from the store. I've already removed the sandbox account, and even using my real Apple ID, I can't use the functions.
Topic:
App & System Services
SubTopic:
StoreKit
Apple notification description:
notificationType:
The type that describes the In-App Purchase or external purchase event for which the App Store sends the version 2 notification.
App Store Server Notifications 2.0+
string notificationType
Possible Values
CONSUMPTION_REQUEST
A notification type that indicates that the customer initiated a refund request for a consumable In-App Purchase or auto-renewable subscription, and the App Store is requesting that you provide consumption data. For more information, see Send Consumption Information.
When the developer receives the refund request notification and sends the refundPreference, they say:
GRANT_PRORATED
You prefer that the App Store grants a prorated refund.
Discussion
Use these values in the refundPreference field of a ConsumptionRequest.
The following constraints apply to the GRANT_PRORATED option:
If the product is a consumable or non-consumable In-App Purchase or a non-renewing subscription, you may include a consumptionPercentage value in the ConsumptionRequest.
Question:
Requesting a refund for a non-consumable type does not send a notification to the developer.
However, when a developer sends a refund preference, they can still send a GRANT_PRORATED request for a non-consumable type.
Topic:
App & System Services
SubTopic:
StoreKit
Hello,
I would like to ask about an Apple ID authentication behavior during in-app purchases.
Our app uses a StoreKit 1 (SKPaymentQueue-based) implementation, and there are no differences in the in-app purchase logic between the TestFlight build and the App Store production build.
However, we have observed that some users are prompted to enter their Apple ID password during in-app purchases.
The observed behavior is as follows:
On the first in-app purchase, the system prompts for the Apple ID password
After the password is entered once, subsequent purchases proceed normally using Face ID (double side-button press)
Even after deleting and reinstalling the app, or switching between TestFlight and App Store builds, the password prompt does not reappear if authentication has already occurred
This behavior can occur even when the Apple ID already has an active auto-renewable subscription
The only confirmed change on our side is:
The app is now built with Xcode 26 instead of Xcode 18
Based on this, we are currently considering the following possible causes:
A change in purchase authentication behavior due to the Xcode version update
Expiration of the Apple ID purchase authentication session after a long period without purchases
In addition to these points, we would like to ask:
Are there any other common conditions or security policies in iOS or the App Store that may cause the system to require Apple ID password input during in-app purchases?
Is this behavior considered expected under certain circumstances?
We would appreciate your clarification on whether this is expected system behavior or if there are any implementation aspects we should further review.
Thank you for your support.
Topic:
App & System Services
SubTopic:
StoreKit
After I configured a consumable subscription(In App Purchases) on the apple platform, when I change the price in the App's server, is there any existing apple Api support to change the price on the apple platform? Of course, I know I need to resubmit.
I am handling the buy subscription with this function
const handleBuySubscription = async (productId) => {
try {
await requestSubscription({
sku: productId,
});
setLoading(false);
} catch (error) {
setLoading(false);
if (error instanceof PurchaseError) {
errorLog({ message: [${error.code}]: ${error.message}, error });
} else {
errorLog({ message: "handleBuySubscription", error });
}
}
};
but the
requestSubscription({
sku: productId,
})
does not return anything, and it is stuck at await
Hello,
I have a problem with a subscription: it is not recognised by my application (under TestFlight); it is as if it did not exist.
I have two subscriptions in the same group, a premium subscription that works perfectly and a basic subscription that is not recognised.
I have checked everything at least twenty times. Its status is ‘Ready to submit’.
I asked GPT 5.1 and Claude AI, but clearly both of their AIs are out of date and are giving me an obsolete procedure with App Store Connect options that don't exist.
Hi,
Using StoreKit 2 with App Store Server notifications like so:
User selects a purchase
App calls Product.purchase()
If successful, App Store notifies our backend with the transaction details, importantly with a UUID for the transaction ID.
This works fine, but when I try to test contingent pricing via the handy StoreKit config Transaction Manager in Xcode by creating a PurchaseIntent if I then complete the purchase in the app the Transaction ID is sequential, (0 for the first, 1 for the second etc), which doesn't work for us as the backend might already have that ID stored so the purchase never completes.
If I disable the config file it works fine, but then I can't use the Transaction Manager debug tool. Is there a way to override the ID of a custom transaction that's created via the StoreKit configuration?
Thanks
There is a project that has been running online for years. A few months ago, a player reported that after making their first successful IAP at a specific purchase point, any subsequent attempts to purchase the same item do not trigger the payment window. Instead, they get the error:"This in-app purchase has already been bought".After contacting Apple Support once, the player was able to make a payment, but the issue reappeared on the next attempt. So far, this is the only user reporting the problem, other people can purchase normally.
Question1:
Here’s what I’ve tried:
I reviewed the code and ensured that TransactionObserveris correctly called.
I’ve also added **[[SKPaymentQueue defaultQueue] finishTransaction:transaction]**in all possible places, but the issue persists.
According to the logs, after the user’s first purchase, every subsequent IAP attempt returns the same receipt from the initial successful transaction, even though I’m certain finishTransactionis being called. It seems like this method isn’t having the intended effect.
Question2:
I asked the player to manually trigger the Restore Purchases button by calling [[SKPaymentQueue defaultQueue] restoreCompletedTransactions].
the restoreCompletedTransactionsFailedWithErrorcallback returned the following error:
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made."
The player has already checked their device time and tried switching between Wi-Fi and 4G, but the error remains. Is this SSL error related to the "already bought" error? Note that this SSL issue occurred during a separate restore process, not during a purchase attempt.
Question: 3:
I noticed that I’m not calling finishTransaction inside the restoreCompletedTransactionsFailedWithErrorcallback. Should I add it there?
Purchase Logs:
The player clicked "Restore Purchases" and then attempted another purchase. The purchase flow appears normal, but the IAP returns an old, already-used receipt.
[2025-12-10 17:41:38:995] Restore transaction failed: Error > Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a > secure connection to the server cannot be made."
[2025-12-10 17:41:40:010] Restore transaction failed: Error > Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a > secure connection to the server cannot be made."
[2025-12-10 17:41:42:011] buy method called... productID: > huoxiancj_648 orderID: 22674511
[2025-12-10 17:41:42:107] ----Log Observers ID----
[2025-12-10 17:41:42:108] ObserverID: 0x109968890
[2025-12-10 17:41:42:108] Processing unfinished transactions...
[2025-12-10 17:41:42:108] Finished processing unfinished > transactions.
[2025-12-10 17:41:42:108] Allowing in-app purchase...
[2025-12-10 17:41:42:215] Requesting product info...
[2025-12-10 17:41:42:989] productsRequest didReceiveResponse:
[2025-12-10 17:41:43:066] Invalid Product ID: (
[2025-12-10 17:41:43:066] Purchase quantity: 1
[2025-12-10 17:41:43:066] Product info:
[2025-12-10 17:41:43:067] Price: 648
[2025-12-10 17:41:43:067] Product ID: huoxiancj_648
[2025-12-10 17:41:43:067] Validating product info...
[2025-12-10 17:41:43:067] Sending payment request...
[2025-12-10 17:41:43:067] requestDidFinish
[2025-12-10 17:41:43:132] paymentQueue updatedTransactions.
[2025-12-10 17:41:43:133] updatedTransactions case > SKPaymentTransactionStatePurchasing
[2025-12-10 17:41:43:208] [payment.applicationUsername] > userid=50306496 appid=1045 instid=12844 reserve=xxxx > productID=22674511
[2025-12-10 17:43:16:008] paymentQueue updatedTransactions.
[2025-12-10 17:43:16:008] updatedTransactions case > SKPaymentTransactionStatePurchased
[2025-12-10 17:43:16:008] productIdentifier= huoxiancj_648
[2025-12-10 17:43:16:113] Sending receipt to server for validation.
[2025-12-10 17:43:16:113] Transaction completed.
Any help or suggestions would be greatly appreciated! Thanks in advance.
Dear Apple Developer Support Team,
I hope you are doing well.
We are reaching out to request clarification and guidance regarding the In-App Purchase (IAP) requirements for our upcoming iOS application.
Our app offers paid access to digital video content. Each video has a dynamic price determined by our backend based on multiple factors (such as duration, category, and promotions). Additionally, users are allowed to select and purchase multiple videos at the same time, which results in a combined total price that varies per transaction.
Challenges we face with IAP on iOS
Dynamic pricing:
Apple requires IAP products to have static pricing defined in App Store Connect.
Our video prices change frequently and cannot be represented by fixed IAP product SKUs.
Multiple-item purchases:
iOS does not support a single purchase that includes multiple different IAP products.
Processing many separate IAP transactions in sequence results in a poor user experience and is likely to cause failures.
Product creation limitations:
Since our catalog contains many videos with frequently changing prices, it is not feasible to create individual IAP products per video.
Given these restrictions, we are unclear how to remain compliant while still providing a functional purchase flow for our users.
Question
In this scenario, where:
video prices are dynamic,
users may purchase multiple videos together, and
IAP does not support multi-item purchases or dynamic pricing,
are we allowed to use Stripe or another external payment provider to handle these purchases?
If not, we would appreciate Apple’s guidance on what the recommended and compliant approach would be for apps that must price digital content dynamically and allow bulk purchasing.
We want to ensure full compliance with App Store Review Guidelines and would like confirmation on the correct implementation strategy before proceeding.
Thank you for your time, and we look forward to your clarification.
Kind regards,
Muhammad Adnan
Koderlabs
I have an iOS and iPadOS app that also runs on macOS Catalyst. The user is able to view their subscription using the SubscriptionStoreView with two SubscriptionOptionGroups.
The documentation does not mention these are supported on macOS Catalyst and the app crashes when attempting to show the SubscriptionStoreView on macOS Catalyst.
If not supported, how can the user manage their subscription on macOS?
I am using the public url https://api.storekit-sandbox.itunes.apple.com/inApps/v1/notifications/jwsPublicKeys to get the jwks keys to verify the signed payload for store kit payments. I am checking Apple server notifications.
const APPLE_JWKS_URL = "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/notifications/jwsPublicKeys"
// Apple JWK set (cached by jose)
const appleJWKS = createRemoteJWKSet(new URL(APPLE_JWKS_URL));
const jwks = await appleJWKS();
logger.debug("Apple JWKS Keys: %O", jwks); // Log the keys
if (!signedPayload) {
// return res.status(400).json({ error: "Missing signedPayload" });
}
// Step 1: Verify JWS (signature + payload) using Apple's JWKS
const { payload, protectedHeader } = await jwtVerify(
signedPayload,
appleJWKS,
{
algorithms: ["ES256"], // Apple uses ES256 for signing
}
);
Hi everyone.
I'm trying to use https://developer.apple.com/documentation/appstoreserverapi/get-transaction-info to retrieve order information. How can I get the refund status of an order through this API? Also, Apple's webhook notification for refunds includes fields like revocationReason and revocationType. Can these be retrieved through the API? I've noticed that some refund orders have these fields when retrieved using get-transaction-info api, but others don't. I don't know the reason for these differences. Could you please explain?
Thank you very much.
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
App Store Server Notifications
App Store Server API