CINXE.COM

IAP Testing Overview | In-App Purchasing

<!doctype html><!--[if IE 8]><html data-19ax5a9jf="dingo" lang="en_US" class="a-no-js a-lt-ie10 a-lt-ie9 a-ie8"><![endif]--><!--[if IE 9]><html data-19ax5a9jf="dingo" lang="en_US" class="a-no-js a-lt-ie10 a-ie9"><![endif]--><!--[if !(IE 8)&!(IE 9)]><!--><html data-19ax5a9jf="dingo" lang="en_US" class="a-no-js"><!--<![endif]--> <head><script>var aPageStart = (new Date()).getTime();</script><meta charset="utf-8"/> <link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/11EIQ5IGqaL._RC|01e5ncglxyL.css,01lF2n-pPaL.css,41DLtM-IPiL.css,31iNSIr1kuL.css,011DCEwfbwL.css,013z33uKh2L.css,01R9dtRDQdL.css,01rhj7BIeEL.css,410iOIpxjqL.css,11TIuySqr6L.css,01ElnPiDxWL.css,114oHnH0QRL.css,01crd53+KxL.css,01IdKcBuAdL.css,01y-XAlI+2L.css,01RgENaJKWL.css,219sMS379pL.css,01oDR3IULNL.css,51CguxBmgsL.css,01XPHJk60-L.css,01lN1FNc-RL.css,21Z4Q-IpuWL.css,11MrAKjcAKL.css,21qHKSTSJCL.css,11Zh8bU-hoL.css,01CFUgsA-YL.css,31jsrAUX5KL.css,11WHSxzwhML.css,11MO3b1rxzL.css,11ylgxpE+pL.css,11b-GR26DVL.css,01j2JE3j7aL.css,11maZ3sCvAL.css,21+98GSaU1L.css,11TxiWYBNOL.css,01chhhuYckL.css,21Q7cg1AwNL.css,1128pDOWgAL.css,11mA7+zB7BL.css,01G+-woTSUL.css,01890+Vwk8L.css,01b3+vZ+YbL.css,01cbS3UK11L.css,21kdNu0AlvL.css,0116OOHSwvL.css_.css?AUIClients/AmazonUI#us.trident" /> <link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/71cTjwDJRNL.css?AUIClients/DeXWebsiteAUIAssets" /> <meta charset="utf-8"> <title>IAP Testing Overview | In-App Purchasing </title> <meta name="description" content="Amazon provides several tools and services to help you test your IAP implementation. The following sections provide information about these tools and a suggested workflow for te..."> <meta name="keywords" content=""> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="icon" type="image/x-icon" href="https://amzndevresources.com/jekyll/css/favicon.ico"> <!-- FontAwesome (GPL license) --> <link rel="stylesheet" type="text/css" href="https://amzndevresources.com/jekyll/css/font-awesome/css/font-awesome.min.css"> <meta name="google-site-verification" content="wfEDah_6uJe9Y7uIfLrVycd_efr8wQ9YO-fM_5MI5w0" /> <meta name="google-site-verification" content="Eu8BqTWMhRRdfCAdqUh2RYb3SjAiuFp4wmgTtGcteM0" /> <link rel="alternate" href="https://developer.amazon.com/docs/in-app-purchasing/iap-testing-overview.html" hreflang="en_US" /> <link rel="canonical" href="https://developer.amazon.com/docs/in-app-purchasing/iap-testing-overview.html" /> <meta name="google-site-verification" content="KHmp6TUPKc1gHlM9TuB842pcV7TxZVV6TgenZtsYoNY" /> <meta name="msvalidate.01" content="9761B379C1B64F587D71BA40337FDD07" /> <script language="JavaScript" type="text/javascript"> var digitalData ={ page:{ pageInfo: { pageInstanceID: "docs\/in\-app\-purchasing\/iap\-testing\-overview.html", path: "\/docs\/in\-app\-purchasing\/iap\-testing\-overview.html", pageID: "", pageTitle: "", pageType: "DeX", primaryCategory: "appstore", pageName: "", language: "en_US" } }, user:{ userID: "", ipAddress: "8.222.208.146" } }; var urlSplit = "\/docs\/in\-app\-purchasing\/iap\-testing\-overview.html".split("/"); var trailingSlash = urlSplit.pop(); var pTitle = trailingSlash; if (trailingSlash == ""){ pTitle = urlSplit.pop() } if ("".indexOf("search") !== -1) { digitalData.page.pageInfo.searchResultsNum = ""; } if ("".indexOf("dex-home") !== -1){ digitalData.page.pageInfo.pageID = "Home"; digitalData.page.pageInfo.pageTitle = "Home"; digitalData.page.pageInfo.primaryCategory = "Home"; } else { digitalData.page.pageInfo.pageID = pTitle; pTitle = pTitle.replace(/(^|-)[a-z]/g,function(f){return f.toUpperCase();}); pTitle = pTitle.replace(/-/g, ''); digitalData.page.pageInfo.pageTitle = pTitle; var pCat = digitalData.page.pageInfo.primaryCategory; pCat = pCat.replace(/(^|-)[a-z]/g,function(f){return f.toUpperCase();}); pCat = pCat.replace(/-/g, ''); digitalData.page.pageInfo.primaryCategory = pCat; } var pageNameStr = "" + digitalData.page.pageInfo.primaryCategory; //Todo: add in logic for sub-categories when AOI is implemented. if (digitalData.page.pageInfo.pageTitle != null){ if (pageNameStr != ""){ pageNameStr += ":"; } pageNameStr += digitalData.page.pageInfo.pageTitle; } digitalData.page.pageInfo.pageName = pageNameStr; (function (w) { w.URLSearchParams = w.URLSearchParams || function (searchString) { var self = this; self.searchString = searchString; self.get = function (name) { var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(self.searchString); if (results == null) { return null; } else { return decodeURI(results[1]) || 0; } }; } })(window); </script> <script src="https://m.media-amazon.com/images/G/01/envImprovement/js/jquery/jquery-3.5.1.min.js" crossorigin="anonymous"></script> <script src="https://ds6yc8t7pnx74.cloudfront.net/content/dam/developer-portal/analytics/prod/launch-EN968f8a7401fc4ccea43ced61e7b0c2bb.min.js" async></script> <link rel="stylesheet" type="text/css" href="https://d20632htc2msyc.cloudfront.net/static/css/main.css" /> <script defer src="https://d20632htc2msyc.cloudfront.net/static/js/main.js"></script> <script type="text/javascript"> (function() { var didInit = false; function initMunchkin() { if(didInit === false) { didInit = true; Munchkin.init('365-EFI-026'); } } var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = '//munchkin.marketo.net/munchkin.js'; s.onreadystatechange = function() { if (this.readyState == 'complete' || this.readyState == 'loaded') { initMunchkin(); } }; s.onload = initMunchkin; document.getElementsByTagName('head')[0].appendChild(s); })(); </script> </head> <body class="a-m-us a-aui_72554-c a-aui_a11y_1_699934-c a-aui_a11y_4_835613-c a-aui_a11y_6_837773-c a-aui_a11y_sr_678508-c a-aui_killswitch_csa_logger_372963-c a-aui_pci_risk_banner_210084-c a-aui_preload_261698-c a-aui_rel_noreferrer_noopener_309527-c a-aui_template_weblab_cache_333406-c a-aui_tnr_v2_180836-c"><div id="a-page"><script type="a-state" data-a-state="{&quot;key&quot;:&quot;a-wlab-states&quot;}">{"AUI_A11Y_6_837773":"C","AUI_TNR_V2_180836":"C","AUI_PRELOAD_261698":"C","AUI_TEMPLATE_WEBLAB_CACHE_333406":"C","AUI_72554":"C","AUI_A11Y_1_699934":"C","AUI_A11Y_4_835613":"C","AUI_KILLSWITCH_CSA_LOGGER_372963":"C","AUI_A11Y_SR_678508":"C","AUI_REL_NOREFERRER_NOOPENER_309527":"C","AUI_PCI_RISK_BANNER_210084":"C"}</script> <link rel="stylesheet" type="text/css" href="https://m.media-amazon.com/images/G/01/Fonts/FontAwesome/css/font-awesome.min._V516135338_.css"> <header class='dpHeader dphThemedark'> <div class='dphTopBar clearfix'> <div class='dphLeft'> <div class='dphMenuToggle'> <i class='dphMenuIcon'></i> <i class='dphMenuBackIcon'></i> </div> <a class='dphLogo' href='/apps-and-games'> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logos/amazonAppstoreLogoDarkBG1x_new.png" srcset="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logos/amazonAppstoreLogoDarkBG1x_new.png 1x, https://m.media-amazon.com/images/G/01/mobile-apps/dex/logos/amazonAppstoreLogoDarkBG2x.png 2x" alt="Amazon Developer Logo"> </a> </div> <div class='dphRight'> <div class="dphSearchBarWrap"> <!-- Used in tech docs to hide side bar search results when we rollout new search --> <script type="text/javascript"> window.newSearch = true; </script> <div hidden style="display: none;" class="new-search-flag" data-val="enabled"></div> <div hidden style="display: none;" class="new-search-metadata"> {"settingsUrl":"https://ds6yc8t7pnx74.cloudfront.net/devportal-digital-assets/cf/developer-portal/getDeXSearchData"} </div> <div id="dex-search-header-bar"> </div> </div> <a href="/home.html" class='dphConsole dphLink'>Developer Console</a> <div class='dphUserInfo'> <a class="dphLink" href="/settings/console/registration?return_to=/docs/in-app-purchasing/iap-testing-overview.html">Sign In</a> </div> <style> #notification-counter { position: absolute; top: 2px; padding: 0 2px; min-width: 20px; background: #BF2727; color: white; font-size: 11px; border-radius: 3px; line-height: 20px; text-align: center; } #notification_click_icon { width: 32px; height: 32px; background-color: #31465f; text-align: center; line-height: 32px; border-radius: 50%; margin-right: 15px; color: white; font-weight: 300; cursor: pointer; } #notification-placeholder { position: absolute; top:45px; } #notification_flyout_iframe_id { display: none; position: absolute; width: 425px; border: none; transform: translate(-80%); transition: all 0.2s; } @media screen and (max-width: 992px) { #notification_click_icon { position: fixed; display: inline-block; right: 44px; } #notification_click_icon ~ .dphSearch.active { position: relative; z-index: 0; } #notification-placeholder { top:28px; } #notification-counter { top: -6px; } } @media screen and (max-width: 414px) { #notification_flyout_iframe_id { transform: none; right: -99px; width: 100vw; } #notification_click_icon ~ .dphSearch.active { position: relative; z-index: 0; } } </style> <div id='navFlyout?' class='dphFlyoutItem dphDevConsoleLinkTopBar dphButton'> <span class='dphConsole dphLink'>?</span> <div class='dphDropdownWrap'> <nav class='dphDropdown accrItem'> <div class='dpIconArrow accrHandle'></div> <ul class='dphDropdownList'> <li class='dphdItem'><a href='/support/'>Support</a></li> <li class='dphdItem'><a href='/documentation/'>Docs</a></li> <li class='dphdItem'><a href='/support/contact-us'>Contact Us</a></li> <li class='dphdItem'><a href='/support/cases'>My Appstore Cases</a></li> </ul> </nav> </div> </div> </div> </div> <div class='dphNavigation accordion' data-accr_active_width='327'> <div class='dphnWrap'> <div class='dphUserInfo'> <a class="dphLink" href="/settings/console/registration?return_to=/docs/in-app-purchasing/iap-testing-overview.html">Sign In</a> </div> <a href="/home.html" class='dphConsole dphLink'>Developer Console</a> <nav class="dpPrimaryNav"> <ul class="dppnItems"> <li class="dppnItem accrItem"> <span class="dppnLink"> Devices </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Fire TV</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/apps-and-games/fire-tv" class="dppnfLink"> <span class="dppnfTitle">About</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/getting-started-developing-apps-and-games.html" class="dppnfLink"> <span class="dppnfTitle">Get started</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/device-specifications.html" class="dppnfLink"> <span class="dppnfTitle">Device specs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/device-specifications-comparison-table.html" class="dppnfLink"> <span class="dppnfTitle">Compare devices</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/fire-os-overview.html" class="dppnfLink"> <span class="dppnfTitle">Fire OS for TV</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Fire tablets</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/apps-and-games/fire-tablets" class="dppnfLink"> <span class="dppnfTitle">About</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/ft-get-started.html" class="dppnfLink"> <span class="dppnfTitle">Get started</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/ft-device-specifications.html" class="dppnfLink"> <span class="dppnfTitle">Device specs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/fire-os-8.html" class="dppnfLink"> <span class="dppnfTitle">Fire OS for tablets</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <span class="dppnLink"> Build </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Fire TV apps</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/docs/fire-tv/getting-started-developing-apps-and-games.html" class="dppnfLink"> <span class="dppnfTitle">Get started</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/design-and-user-experience-guidelines.html" class="dppnfLink"> <span class="dppnfTitle">UX guidelines</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/remote-input.html" class="dppnfLink"> <span class="dppnfTitle">Remote control input</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/connecting-adb-to-device.html" class="dppnfLink"> <span class="dppnfTitle">Connect through Android Debug Bridge</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/self-service-advertising.html" class="dppnfLink"> <span class="dppnfTitle">Promote your TV app</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Fire tablet apps</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/docs/fire-tablets/ft-get-started.html" class="dppnfLink"> <span class="dppnfTitle">Get started</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/ft-ux-specifications.html" class="dppnfLink"> <span class="dppnfTitle">UX guidelines</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/connecting-adb-to-device.html" class="dppnfLink"> <span class="dppnfTitle">Connect through Android Debug Bridge</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/sdks" class="dppnfLink"> <span class="dppnfTitle">SDKs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/app-submission/migrate-existing-app.html" class="dppnfLink"> <span class="dppnfTitle">Porting Android apps</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/services-and-apis/monetization" class="dppnfLink"> <span class="dppnfTitle">Monetizing apps</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/services-and-apis" class="dppnfLink"> <span class="dppnfTitle">Services & APIs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/blogs/tag.best-practices" class="dppnfLink"> <span class="dppnfTitle">Best practices</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <span class="dppnLink"> Test </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <a href="/docs/app-testing/test-criteria.html" class="dppnfLink"> <span class="dppnfTitle">App testing criteria</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/app-testing/live-app-testing-getting-started.html" class="dppnfLink"> <span class="dppnfTitle">Live App Testing</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/in-app-purchasing/iap-testing-overview.html" class="dppnfLink"> <span class="dppnfTitle">In-app purchasing testing</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Quality performance</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/docs/app-testing/test-criteria.html#test-criteria-group-2-key-app-performance-indicators" class="dppnfLink"> <span class="dppnfTitle">Key performance indicators</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/app-testing/app-performance-scripts.html" class="dppnfLink"> <span class="dppnfTitle">App performance scripts</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <span class="dppnLink"> Publish </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <a href="/docs/app-submission/understanding-submission.html" class="dppnfLink"> <span class="dppnfTitle">Publishing overview</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/policy-center/understanding-content-policy.html" class="dppnfLink"> <span class="dppnfTitle">App content policies</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/reports-promo/UI-reports-dashboard.html" class="dppnfLink"> <span class="dppnfTitle">Revenue reporting</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/app-submission/manage-account-and-permissions.html" class="dppnfLink"> <span class="dppnfTitle">Developer account management</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <span class="dppnLink"> Connect </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <a href="/apps-and-games/blogs" class="dppnfLink"> <span class="dppnfTitle">Blogs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/events" class="dppnfLink"> <span class="dppnfTitle">Events</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="https://community.amazondeveloper.com/" class="dppnfLink"> <span class="dppnfTitle">Appstore Developer Community</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/apps-and-games/release-notes.html" class="dppnfLink"> <span class="dppnfTitle">Release notes</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <a href="/docs/apps-and-games/documentation.html" class="dppnLink"> Docs </a> </li> </ul> </nav> <nav class="dpPrimaryNav dphDevConsoleLinkNavBar"> <ul class="dppnItems"> <li class="dppnItem accrItem"> <span class='dppnLink'>Support</span> <div class="dpIconArrow accrHandle"></div> <div class="dppnFlyoutWrap"> <div class="dppnSecondaryNavWrap"> <ul class='dppnFlyout dppnSecondaryNav'> <li class='dppnfItem accrItem'><a class="dppnfLink" href='/support/'><span class="dppnfTitle">Support</span></a></li> <li class='dppnfItem accrItem'><a class="dppnfLink" href='/documentation/'><span class="dppnfTitle">Docs</span></a></li> <li class='dppnfItem accrItem'><a class="dppnfLink" href='/support/contact-us'><span class="dppnfTitle">Contact Us</span></a></li> <li class='dppnfItem accrItem'><a class="dppnfLink" href='/support/cases'><span class="dppnfTitle">My Appstore Cases</span></a></li> </ul> </div> </div> </li> </ul> </nav> </div> </div> </header> <div id='dpHeaderPlaceholder'></div> <script> (function(){ //Set placeholder height as soon as possible to eliminate page jump "use strict"; var setHeaderPlaceholderHeight = function(header){ var placeholder = document.getElementById('dpHeaderPlaceholder'); var headerHeight = header[0].offsetHeight + "px"; placeholder.style.height = headerHeight; } var checkForHeader = function(){ var header = document.querySelectorAll('.dpHeader'); if(header.length){ setHeaderPlaceholderHeight(header); window.clearInterval(checkForHeaderInterval); } } var checkForHeaderInterval = window.setInterval(checkForHeader, 10); checkForHeader(); //Run once immediately }()); </script> <script> (function(a,b,c,d){if((a=a.AmazonUIPageJS||a.P)&&a.when&&a.register)throw Error("A copy of P has already been loaded on this page.");})(window,document,Date);(function(a,b,c,d){"use strict";a._pSetI=function(){return null}})(window,document,Date);(function(a,c,d,e){"use strict";a._sw=function(){var b;return function(a,c,d,e,f,g,h,k,l,m){b||(b=!0)}}()})(window,document,Date);(function(c,e,I,B){"use strict";c._pd=function(){var a,u;return function(C,f,h,k,b,D,v,E,F){function w(d){try{return d()}catch(J){return!1}}function l(){if(m){var d={w:c.innerWidth||b.clientWidth,h:c.innerHeight||b.clientHeight};5<Math.abs(d.w-q.w)||50<d.h-q.h?(q=d,n=4,(d=a.mobile||a.tablet?450<d.w&&d.w>d.h:1250<=d.w)?k(b,"a-ws"):b.className=v(b,"a-ws")):0<n&&(n--,x=setTimeout(l,16))}}function G(d){(m=d===B?!m:!!d)&&l()}function H(){return m}if(!u){u=!0;var r=function(){var d=["O","ms","Moz","Webkit"], c=e.createElement("div");return{testGradients:function(){return!0},test:function(a){var b=a.charAt(0).toUpperCase()+a.substr(1);a=(d.join(b+" ")+b+" "+a).split(" ");for(b=a.length;b--;)if(""===c.style[a[b]])return!0;return!1},testTransform3d:function(){return!1}}}(),y=b.className,z=/(^| )a-mobile( |$)/.test(y),A=/(^| )a-tablet( |$)/.test(y);a={audio:function(){return!!e.createElement("audio").canPlayType},video:function(){return!!e.createElement("video").canPlayType},canvas:function(){return!!e.createElement("canvas").getContext}, svg:function(){return!!e.createElementNS&&!!e.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect},offline:function(){return navigator.hasOwnProperty&&navigator.hasOwnProperty("onLine")&&navigator.onLine},dragDrop:function(){return"draggable"in e.createElement("span")},geolocation:function(){return!!navigator.geolocation},history:function(){return!(!c.history||!c.history.pushState)},webworker:function(){return!!c.Worker},autofocus:function(){return"autofocus"in e.createElement("input")}, inputPlaceholder:function(){return"placeholder"in e.createElement("input")},textareaPlaceholder:function(){return"placeholder"in e.createElement("textarea")},localStorage:function(){return"localStorage"in c&&null!==c.localStorage},orientation:function(){return"orientation"in c},touch:function(){return"ontouchend"in e},gradients:function(){return r.testGradients()},hires:function(){var a=c.devicePixelRatio&&1.5<=c.devicePixelRatio||c.matchMedia&&c.matchMedia("(min-resolution:144dpi)").matches;E("hiRes"+ (z?"Mobile":A?"Tablet":"Desktop"),a?1:0);return a},transform3d:function(){return r.testTransform3d()},touchScrolling:function(){return f(/Windowshop|android|OS ([5-9]|[1-9][0-9]+)(_[0-9]{1,2})+ like Mac OS X|SOFTWARE=([5-9]|[1-9][0-9]+)(.[0-9]{1,2})+.*DEVICE=iPhone|Chrome|Silk|Firefox|Trident.+?; Touch/i)},ios:function(){return f(/OS [1-9][0-9]*(_[0-9]*)+ like Mac OS X/i)&&!f(/trident|Edge/i)},android:function(){return f(/android.([1-9]|[L-Z])/i)&&!f(/trident|Edge/i)},mobile:function(){return z}, tablet:function(){return A},rtl:function(){return"rtl"===b.dir}};for(var g in a)a.hasOwnProperty(g)&&(a[g]=w(a[g]));for(var t="textShadow textStroke boxShadow borderRadius borderImage opacity transform transition".split(" "),p=0;p<t.length;p++)a[t[p]]=w(function(){return r.test(t[p])});var m=!0,x=0,q={w:0,h:0},n=4;l();h(c,"resize",function(){clearTimeout(x);n=4;l()});b.className=v(b,"a-no-js");k(b,"a-js");!f(/OS [1-8](_[0-9]*)+ like Mac OS X/i)||c.navigator.standalone||f(/safari/i)||k(b,"a-ember"); h=[];for(g in a)a.hasOwnProperty(g)&&a[g]&&h.push("a-"+g.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()}));k(b,h.join(" "));b.setAttribute("data-aui-build-date",F);C.register("p-detect",function(){return{capabilities:a,localStorage:a.localStorage&&D,toggleResponsiveGrid:G,responsiveGridEnabled:H}});return a||{}}}}()})(window,document,Date);(function(g,l,C,D){function E(a){n&&n.tag&&n.tag(p(":","aui",a))}function m(a,b){n&&n.count&&n.count("aui:"+a,0===b?0:b||(n.count("aui:"+a)||0)+1)}function F(a){try{return a.test(navigator.userAgent)}catch(b){return!1}}function G(a){return"function"===typeof a}function u(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)}function p(a,b,c,f){b=b&&c?b+a+c:b||c;return f?p(a,b,f):b}function y(a,b,c){try{Object.defineProperty(a,b,{value:c,writable:!1})}catch(f){a[b]= c}return c}function O(a,b){a.className=P(a,b)+" "+b}function P(a,b){return(" "+a.className+" ").split(" "+b+" ").join(" ").replace(/^ | $/g,"")}function ca(a,b,c){var f=c=a.length,e=function(){f--||(H.push(b),I||(q?q.set(z):setTimeout(z,0),I=!0))};for(e();c--;)Q[a[c]]?e():(v[a[c]]=v[a[c]]||[]).push(e)}function da(a,b,c,f,e){var d=l.createElement(a?"script":"link");u(d,"error",f);e&&u(d,"load",e);a?(d.type="text/javascript",d.async=!0,c&&/AUIClients|images[/]I/.test(b)&&d.setAttribute("crossorigin", "anonymous"),d.src=b):(d.rel="stylesheet",d.href=b);l.getElementsByTagName("head")[0].appendChild(d)}function R(a,b){return function(c,f){function e(){da(b,c,d,function(b){J?m("resource_unload"):d?(d=!1,m("resource_retry"),e()):(m("resource_error"),a.log("Asset failed to load: "+c));b&&b.stopPropagation?b.stopPropagation():g.event&&(g.event.cancelBubble=!0)},f)}if(S[c])return!1;S[c]=!0;m("resource_count");var d=!0;return!e()}}function ea(a,b,c){for(var f={name:a,guard:function(c){return b.guardFatal(a, c)},guardTime:function(a){return b.guardTime(a)},logError:function(c,d,e){b.logError(c,d,e,a)}},e=[],d=0;d<c.length;d++)A.hasOwnProperty(c[d])&&(e[d]=K.hasOwnProperty(c[d])?K[c[d]](A[c[d]],f):A[c[d]]);return e}function w(a,b,c,f,e){return function(d,k){function n(){var a=null;f?a=k:G(k)&&(q.start=r(),a=k.apply(g,ea(d,h,l)),q.end=r());if(b){A[d]=a;a=d;for(Q[a]=!0;(v[a]||[]).length;)v[a].shift()();delete v[a]}q.done=!0}var h=e||this;G(d)&&(k=d,d=D);b&&(d=d?d.replace(T,""):"__NONAME__",L.hasOwnProperty(d)&& h.error(p(", reregistered by ",p(" by ",d+" already registered",L[d]),h.attribution),d),L[d]=h.attribution);for(var l=[],m=0;m<a.length;m++)l[m]=a[m].replace(T,"");var q=x[d||"anon"+ ++fa]={depend:l,registered:r(),namespace:h.namespace};d&&ha.hasOwnProperty(d);c?n():ca(l,h.guardFatal(d,n),d);return{decorate:function(a){K[d]=h.guardFatal(d,a)}}}}function U(a){return function(){var b=Array.prototype.slice.call(arguments);return{execute:w(b,!1,a,!1,this),register:w(b,!0,a,!1,this)}}}function M(a,b){return function(c, f){f||(f=c,c=D);var e=this.attribution;return function(){h.push(b||{attribution:e,name:c,logLevel:a});var d=f.apply(this,arguments);h.pop();return d}}}function B(a,b){this.load={js:R(this,!0),css:R(this)};y(this,"namespace",b);y(this,"attribution",a)}function V(){l.body?k.trigger("a-bodyBegin"):setTimeout(V,20)}"use strict";var t=C.now=C.now||function(){return+new C},r=function(a){return a&&a.now?a.now.bind(a):t}(g.performance),ia=r(),ha={},n=g.ue;E();E("aui_build_date:3.24.1-2024-12-05");var W={getItem:function(a){try{return g.localStorage.getItem(a)}catch(b){}}, setItem:function(a,b){try{return g.localStorage.setItem(a,b)}catch(c){}}},q=g._pSetI(),H=[],ja=[],I=!1,ka=navigator.scheduling&&"function"===typeof navigator.scheduling.isInputPending;var z=function(){for(var a=q?q.set(z):setTimeout(z,0),b=t();ja.length||H.length;)if(H.shift()(),q&&ka){if(150<t()-b&&!navigator.scheduling.isInputPending()||50<t()-b&&navigator.scheduling.isInputPending())return}else if(50<t()-b)return;q?q.clear(a):clearTimeout(a);I=!1};var Q={},v={},S={},J=!1;u(g,"beforeunload",function(){J= !0;setTimeout(function(){J=!1},1E4)});var T=/^prv:/,L={},A={},K={},x={},fa=0,X=String.fromCharCode(92),h=[],Y=!0,Z=g.onerror;g.onerror=function(a,b,c,f,e){e&&"object"===typeof e||(e=Error(a,b,c),e.columnNumber=f,e.stack=b||c||f?p(X,e.message,"at "+p(":",b,c,f)):D);var d=h.pop()||{};e.attribution=p(":",e.attribution||d.attribution,d.name);e.logLevel=d.logLevel;e.attribution&&console&&console.log&&console.log([e.logLevel||"ERROR",a,"thrown by",e.attribution].join(" "));h=[];Z&&(d=[].slice.call(arguments), d[4]=e,Z.apply(g,d))};B.prototype={logError:function(a,b,c,f){b={message:b,logLevel:c||"ERROR",attribution:p(":",this.attribution,f)};if(g.ueLogError)return g.ueLogError(a||b,a?b:null),!0;console&&console.error&&(console.log(b),console.error(a));return!1},error:function(a,b,c,f){a=Error(p(":",f,a,c));a.attribution=p(":",this.attribution,b);throw a;},guardError:M(),guardFatal:M("FATAL"),guardCurrent:function(a){var b=h[h.length-1];return b?M(b.logLevel,b).call(this,a):a},guardTime:function(a){var b= h[h.length-1],c=b&&b.name;return c&&c in x?function(){var b=r(),e=a.apply(this,arguments);x[c].async=(x[c].async||0)+r()-b;return e}:a},log:function(a,b,c){return this.logError(null,a,b,c)},declare:w([],!0,!0,!0),register:w([],!0),execute:w([]),AUI_BUILD_DATE:"3.24.1-2024-12-05",when:U(),now:U(!0),trigger:function(a,b,c){var f=t();this.declare(a,{data:b,pageElapsedTime:f-(g.aPageStart||NaN),triggerTime:f});c&&c.instrument&&N.when("prv:a-logTrigger").execute(function(b){b(a)})},handleTriggers:function(){this.log("handleTriggers deprecated")}, attributeErrors:function(a){return new B(a)},_namespace:function(a,b){return new B(a,b)},setPriority:function(a){Y?Y=!1:this.log("setPriority only accept the first call.")}};var k=y(g,"AmazonUIPageJS",new B);var N=k._namespace("PageJS","AmazonUI");N.declare("prv:p-debug",x);k.declare("p-recorder-events",[]);k.declare("p-recorder-stop",function(){});y(g,"P",k);V();if(l.addEventListener){var aa;l.addEventListener("DOMContentLoaded",aa=function(){k.trigger("a-domready");l.removeEventListener("DOMContentLoaded", aa,!1)},!1)}var ba=l.documentElement,la=g._pd(k,F,u,O,ba,W,P,m,"3.24.1-2024-12-05");F(/UCBrowser/i)||la.localStorage&&O(ba,W.getItem("a-font-class"));k.declare("a-event-revised-handling",!1);g._sw(N,p,F,X,m,n,E,G,u,k);k.declare("a-fix-event-off",!1);m("pagejs:pkgExecTime",r()-ia)})(window,document,Date); (window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/61ZS63EQSsL._RC|11Y+5x+kkTL.js,51-UZWCmY3L.js,11yKORv-GTL.js,11na7Dl1tFL.js,21uGjv2MRDL.js,01VRMV3FBdL.js,21BJeD9yjcL.js,01cS+tLhj4L.js,11rRjDLdAVL.js,51UOrPXYGsL.js,11YA5PIFcPL.js,11UNP9ncXuL.js,11qGWmpSUoL.js,11EWRk6r74L.js,21paGe30x-L.js,01490L6yBnL.js,51Xt+PG12aL.js,01JYHc2oIlL.js,31nfKXylf6L.js,01ezj5Rkz1L.js,11bEz2VIYrL.js,31o2NGTXThL.js,01rpauTep4L.js,01RMmNcPMuL.js_.js?AUIClients/AmazonUI#trident'); (window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/616qGtYUw7L.js?AUIClients/DeXWebsiteAUIAssets'); </script> <div class="content-section"> <div class="docs"> <!-- jQuery (MIT license)--> <script src="https://amzndevresources.com/jekyll/js/jquery-3.6.0.min.js"></script> <!-- Bootstrap 4.4 css --> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/bootstrap4.css"> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/styleoverrides.css"> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/popovers.css"> <!-- Navgoco --> <script src="https://amzndevresources.com/jekyll/js/jquery.navgoco.min.js"></script> <!-- jQuery cookie (MIT license)--> <script type="text/javascript" src="https://amzndevresources.com/jekyll/js/jquery.cookie.js"></script> <!-- Bootstrap (MIT license)--> <script src="https://amzndevresources.com/jekyll/js/bootstrap.4.4.1.bundle.min.js"></script> <!-- Anchor JS (MIT license)--> <script src="https://amzndevresources.com/jekyll/js/anchor.min.js"></script> <!-- Initialization scripts --> <script src="https://amzndevresources.com/jekyll/js/initialization_scripts.js"></script> <!-- Tech doc css fixes now incorporated into stylesheet --> <div class="container"> <!-- sidebar --> <div id="sidebar"> <!-- sidebar_hide_weblab --> <div class="mydocsidebar"> <div id="search-searchbar"></div> <script src="https://amzndevresources.com/alexa/jekyll/js/new-nav/CoveoJsSearch.min.js"></script> <link rel="stylesheet" href="https://amzndevresources.com/alexa/jekyll/js/new-nav/CoveoFullSearch.css"> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/search.css"> <script> if (!window.newSearch) { document.addEventListener("DOMContentLoaded", function () { const searchBoxRoot = document.getElementById("searchbox"); const organizationId = "amazoncomproduction9q1by2xb"; const accessToken = "xx42d66989-6d5b-4bd4-bc36-d3b3a04aa40f"; Coveo.SearchEndpoint.configureCloudV2Endpoint(organizationId, accessToken); Coveo.initSearchbox(searchBoxRoot, "https://developer.amazon.com/docs/appstore/search.html"); }); } </script> <div id="searchbox" class="CoveoSearchInterface" data-enable-history="true" data-results-per-page="80" data-excerpt-length="120" data-enable-duplicate-filtering="true" data-pipeline="AppstoreTechDocs" style="display:none"> <script> document.addEventListener("DOMContentLoaded", function () { let root = document.querySelector("#searchbox"); // event handler to group results by “source” Coveo.$$(root).on("preprocessResults", function (e, args) { // Split the "title suffix" to be the "category" because we don't have anything else in yet in the index. let results = args.results.results.map((r) => { const title = r.title; if (title.includes("|")) { // set the category r.raw.category = title.split("|")[1].trim(); r.title = title.split("|")[0].trim(); } else { r.raw.category = "YouTube"; } return r; }); // sort results per category results = results.sort((a, b) => { return a.raw.category.localeCompare(b.raw.category); }); // Set a category Label for the first results of the category. // Keep only 3 items per category. let lastCategory = ""; let categoryCount = 0; results.forEach((r, idx) => { if (lastCategory !== r.raw.category) { lastCategory = r.raw.category; categoryCount = 0; r.raw.categoryLabel = r.raw.category; } categoryCount++; if (categoryCount > 3) { // we already have 3 items for this category r.toDelete = true; } }); // clear out the results marked for deletion results = results.filter((r) => !r.toDelete); args.results.results = results; }); }); $(document).ready(function () { $(".inline").click(function () { $(".coveo-show-if-no-results").hide(); }); }); document.addEventListener("DOMContentLoaded", function () { $("#searchbox .magic-box input").attr("placeholder", "Search Appstore Docs (BETA)"); }); </script> <div class="CoveoAnalytics" data-anonymous="true" data-search-hub="appstore-dropdown-search"></div> <div class="coveo-search-section"> <div class="CoveoSearchbox" data-enable-omnibox="true" data-enable-query-syntax="true" data-search-as-you-type-delay="300"> <div class="CoveoOmniboxResultList" data-layout="list"> <div class="coveo-show-if-results"> <script class="result-template" type="text/x-underscore"> <div> <% if (raw.categoryLabel ) { %> <div class="category-label CoveoFieldValue" data-field="@categoryLabel"></div> <% } %> <div class="co-highlight"> <div> <a class='CoveoResultLink'></a> </div> <div class='CoveoExcerpt'></div> <div class="CoveoFieldValue CoveoCrumb" data-field="@crumb"></div> </div> </div> </script> </div> <div class="coveo-show-if-no-results"> <p>No results found</p> <div class="co-empty">Try a different or more specific query.</div> </div> </div> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", function () { var searchInterface = document.querySelector("#searchbox"); Coveo.$$(searchInterface).on("populateOmnibox", function (e, populateOmniboxObject) { var linkElement = document.createElement("a"); var query = populateOmniboxObject.completeQueryExpression.word; if (!query) { return; } linkElement.href = "https://developer.amazon.com/docs/appstore/search.html#q=" + encodeURIComponent(query); linkElement.text = 'See more results for "' + query + '"'; linkElement.className = "coveo-omnibox-selectable co-more-results"; linkElement["no-text-suggestion"] = true; linkElement.addEventListener("keyboardSelect", function () { linkElement.click(); }); populateOmniboxObject.rows.push({ element: linkElement, zIndex: 0 }); }); }); </script> <div class="productTitle">In-App Purchasing</div> <p class="external"> <a href="#" id="collapseAll">Collapse All</a> | <a href="#" id="expandAll">Expand All</a> </p> <ul id="docnavsidebar" class="docnav"> <li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Get Started</a> <ul> <li class="level1items"><a href="../in-app-purchasing/iap-overview.html">IAP Overview</a></li> <li class="level1items"><a href="../in-app-purchasing/purchase-types.html">Types of Purchases</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-ux-design-guidelines.html">UX Design Guidelines for IAP</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-migrate-from-google-iab-to-amazon-iap.html">Migrate from Google Play Billing</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-faqs.html">IAP FAQ</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-whats-new.html">Release Notes</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Manage IAP In-App Items</a> <ul> <li class="level1items"><a href="../in-app-purchasing/iap-manage-bulk-items.html">CSV File for IAP Import</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-bulk-items-csv.html">IAP Batch Submission</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-bulk-faqs.html">FAQs for IAP Batch Submission</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-create-and-submit-iap-items.html">Submit Single IAP items</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-submit-iap-apps.html">Submit IAP Applications</a></li> <li class="level1items"><a href="../in-app-purchasing/promotional-pricing.html">Set Up Promotional Pricing</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Quick Subscribe</a> <ul> <li class="level1items"><a href="../in-app-purchasing/quick-subscribe-overview.html">Quick Subscribe Overview</a></li> <li class="level1items"><a href="../in-app-purchasing/set-up-quick-subscribe.html">Set Up Quick Subscribe</a></li> <li class="level1items"><a href="../in-app-purchasing/quick-subscribe-test-cases.html">Quick Subscribe Test Cases</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Appstore SDK In-App Purchasing</a> <ul> <li class="level1items"><a href="../in-app-purchasing/iap-get-started.html">Get Started with Appstore SDK IAP</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-implement-iap.html">Implement Appstore SDK IAP</a></li> <li class="level1items"><a href="../in-app-purchasing/implement-pending-purchases.html">Implement Pending Purchases</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-obfuscate-the-code.html">Obfuscate the App Code</a></li> <li class="level1items"><a href="../in-app-purchasing/migrate-google-billing-appstore-sdk-iap.html">Migrate from Google Play Billing to Appstore SDK</a></li> <li class="level1items"><a href="../in-app-purchasing/transitioning-to-appstore-sdk.html">Transitioning from IAP v2.0</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Tiered Subscriptions</a> <ul> <li class="level1items"><a href="../in-app-purchasing/tiered-subscriptions-overview.html">Tiered Subscriptions Overview</a></li> <li class="level1items"><a href="../in-app-purchasing/tiered-subscriptions-setup.html">Set Up Tiered Subscriptions in Developer Console</a></li> <li class="level1items"><a href="../in-app-purchasing/tiered-subscriptions-integrate-android.html">Integrate Tiered Subscriptions in Android Apps</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-rvs-for-tiered-subs.html">Receipt Verification for Tiered Subscriptions</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Receipt Verification Service</a> <ul> <li class="level1items"><a href="../in-app-purchasing/rvs-overview.html">RVS Overview</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-rvs-for-android-apps.html">RVS for Appstore SDK IAP</a></li> <li class="level1items"><a href="../in-app-purchasing/rvs-cloud-sandbox.html">Use RVS Cloud Sandbox</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-rvs-setup-prod.html">RVS Production Setup for Appstore SDK IAP</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-rvs-examples.html">RVS Examples for Appstore SDK IAP</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Real-Time Notifications for IAP Apps</a> <ul> <li class="level1items"><a href="../in-app-purchasing/real-time-notifications.html">Understanding Real-Time Notifications</a></li> <li class="level1items"><a href="../in-app-purchasing/use-rtn.html">Use Real-Time Notifications</a></li> <li class="level1items"><a href="../in-app-purchasing/rtn-example.html">Real-Time Notifications Examples</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Test IAP Apps</a> <ul> <li class="level1items open"><a href="../in-app-purchasing/iap-testing-overview.html">IAP Testing Overview</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-install-and-configure-app-tester.html">Configure the App Tester</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-app-tester-user-guide.html">App Tester User Guide</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-design-test-cases.html">Test Cases for IAP</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-lat.html">LAT for IAP</a></li> <li class="level1items"><a href="../in-app-purchasing/test-pending-purchases.html">Test Pending Purchases</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">IAP Best Practices</a> <ul> <li class="level1items"><a href="../in-app-purchasing/improve-app-startup-time.html">IAP Best Practice - Improve App Startup Time</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-track-customer-purchase-trends.html">IAP Best Practice - Track Customer Purchase Trends</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">IAP API Reference</a> <ul> <li class="level1items"><a href="../in-app-purchasing/appstore-sdk-api-reference.html">Appstore SDK API Reference</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-api-for-webapps-ref.html">Web App IAP API Reference</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Previous API Versions</a> <ul> <li class="level1items"><a href="../in-app-purchasing/iap-migrate-iapv1-apps-to-iapv2.html">Migrate from IAP v1.0 to IAP v2.0</a></li> <li class="level1items external"><a rel="noopener noreferrer" target="_blank" href="https://amzndevresources.com/iap/API-Reference/index.html">IAP 2.0 API Reference</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-api-for-webapps-overview.html">IAP API for Web Apps</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-api-for-webapps-methods.html">Web App IAP API Methods</a></li> <li class="level1items"><a href="../in-app-purchasing/iap-example-webapp.html">Example IAP Web App</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Digital Rights Management (DRM) for Android</a> <ul> <li class="level1items"><a href="../in-app-purchasing/drm-overview.html">DRM Overview</a></li> <li class="level1items"><a href="../in-app-purchasing/drm-android.html">DRM for Android</a></li> <li class="level1items"><a href="../in-app-purchasing/drm-sample-app.html">DRM Sample App</a></li> </ul> </li> </ul> <hr class="resourceSeparator"> <div class="relatedResources">Other Resources</div> <ul id="entrypages"> <li><a href="../appstore-sdk/integrate-appstore-sdk.html">Integrate the Appstore SDK</a></li> <li><a href="../fire-tv/getting-started-developing-apps-and-games.html">Fire TV</a></li> <li><a href="../fire-app-builder/overview.html">Fire App Builder</a></li> <li><a href="../fire-tablets/ft-get-started.html">Fire Tablets</a></li> <li><a href="../html5-web-apps/webapp-setup-environment.html">HTML5 Web API</a></li> <li><a href="../cross-platform-plugins/cpp-landing-page.html">Cross Platform Engine Plugins</a></li> <li><a href="../app-submission/getting-started.html">Appstore Submission</a></li> <li><a href="https://developer.amazon.com/docs/app-submission/submitting-apps-to-amazon-appstore.html">Submit Your Apps</a></li> <li><a href="https://community.amazondeveloper.com/tag/appstore-iap">In-App Purchasing Forum</a></li> </ul> </div> <script> $("li.open").parents('li').toggleClass("open"); </script> </div> <!-- main area --> <div class="mainColumn"> <div id="content"> <h1>IAP Testing Overview</h1> <script> function activateContentBasedOnHash() { const currentHash = window.location.hash.substring(1); if (currentHash) { const contentElement = document.getElementById(currentHash); if (contentElement) { activateTabAndContent(contentElement); scrollToHashWithOffset(contentElement); } } } function activateTabAndContent(contentElement) { const tabSection = contentElement.closest('.tab-pane'); if (tabSection) { const parentTabLink = document.querySelector(`a[href='#${tabSection.id}']`); if (parentTabLink) { const parentNavTabs = parentTabLink.closest('.nav-tabs'); if (parentNavTabs) { parentNavTabs.querySelectorAll('.nav-link').forEach(link => { link.classList.remove('active', 'show'); }); parentTabLink.classList.add('active', 'show'); } const parentTabContent = tabSection.closest('.tab-content'); if (parentTabContent) { parentTabContent.querySelectorAll('.tab-pane').forEach(tab => { tab.classList.remove('active', 'show'); }); tabSection.classList.add('active', 'show'); } } } } function scrollToHashWithOffset(contentElement) { const header = document.querySelector('.dpHeader'); const totalHeaderHeight = header ? header.offsetHeight + 80 : 80; const targetPosition = contentElement.offsetTop; window.scrollTo({ top: targetPosition - totalHeaderHeight, behavior: 'smooth' }); } document.addEventListener('DOMContentLoaded', () => { setTimeout(activateContentBasedOnHash, 10); }); </script> <p>Amazon provides several tools and services to help you test your IAP implementation. The following sections provide information about these tools and a suggested workflow for testing your app.</p> <ul id="markdown-toc"> <li><a href="#test-tools" id="markdown-toc-test-tools">Test Tools</a> <ul> <li><a href="#app-tester" id="markdown-toc-app-tester">App Tester</a></li> <li><a href="#receipt-verification-service" id="markdown-toc-receipt-verification-service">Receipt Verification Service</a></li> <li><a href="#live-app-testing" id="markdown-toc-live-app-testing">Live App Testing</a></li> </ul> </li> <li><a href="#iap-test-modes" id="markdown-toc-iap-test-modes">IAP Test modes</a> <ul> <li><a href="#sandbox-mode" id="markdown-toc-sandbox-mode">Sandbox mode</a></li> <li><a href="#live-app-testing-lat-mode" id="markdown-toc-live-app-testing-lat-mode">Live App Testing (LAT) mode</a></li> <li><a href="#production-mode" id="markdown-toc-production-mode">Production mode</a></li> </ul> </li> <li><a href="#suggested-testing-process" id="markdown-toc-suggested-testing-process">Suggested testing process</a></li> </ul> <h2 id="test-tools">Test Tools</h2> <p>Use the following tools for testing IAP functionality.</p> <h3 id="app-tester">App Tester</h3> <p>Use <a href="../in-app-purchasing/iap-app-tester-user-guide.html">App Tester</a> to test your IAP API code before you submit your app to the Amazon Appstore.</p> <ul> <li>App Tester runs in sandbox mode to perform unit testing of the IAP API method calls in your app.</li> <li>App Tester intercepts the IAP API requests sent from your app.</li> <li>App Tester generates the API responses, based on a JSON data file that you provide.</li> </ul> <div class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> App Tester does not support the Appstore Billing Compatibility SDK. If you are using the Appstore Billing Compatibility SDK in your app, you can use Live App Testing.</div> <h3 id="receipt-verification-service">Receipt Verification Service</h3> <p><a href="../in-app-purchasing/rvs-overview.html">Receipt Verification Service</a> (RVS) validates the purchase receipts that you upload to your app server. RVS provides a sandbox environment and a production environment.</p> <ul> <li>Use the RVS sandbox environment along with App Tester to verify your receipts in sandbox mode. <em>Available only for Appstore SDK.</em></li> <li>Use the RVS production environment to verify your receipts in production mode and for Live App Testing.</li> </ul> <h3 id="live-app-testing">Live App Testing</h3> <p>Use <a href="../app-testing/live-app-testing-understanding.html">Live App Testing</a> (LAT) to beta test your app with a select group of users. The intent is to give you confidence that your app operates correctly in the production environment.</p> <ul> <li>Testers have access to the full suite of Amazon services in the Amazon production environment</li> <li>Testers will not be charged for any purchases that they make.</li> <li>To test the duration of a subscription in less time, you can set up <a href="../app-testing/accelerated-subscriptions-introduction.html">accelerated subscriptions</a>.</li> <li>In a LAT, you can reset in-app entitlements and subscriptions for your testers as needed.</li> <li>You can create an in-app item only for LAT that won't appear in your live app. For details, see <a href="../in-app-purchasing/iap-lat.html">Live App Testing for IAP</a>.</li> </ul> <h2 id="iap-test-modes">IAP Test modes</h2> <p>In app development, the app progresses through the following testing modes.</p> <h3 id="sandbox-mode">Sandbox mode</h3> <p><em>Available only for Appstore SDK.</em></p> <p>Before you publish your app to the Developer Console, the app runs in sandbox mode.</p> <ul> <li>Sandbox Mode is not automatically detected with the Appstore SDK. You need to set your app in debug mode to run sandbox mode. For more details, see <a href="../in-app-purchasing/iap-app-tester-user-guide.html#installtester">App Tester User Guide</a>.</li> <li>You use App Tester to perform unit testing of the IAP API method calls in your app.</li> <li>You can also test receipt verification using the RVS sandbox environment.</li> </ul> <h3 id="live-app-testing-lat-mode">Live App Testing (LAT) mode</h3> <p>Prior to publishing an app, you can run the app in the production environment, but with a restricted set of testers. For more details, see <a href="#live-app-testing">Live App Testing</a> in the Test Tools section above.</p> <ul> <li>Testers will not be charged for any purchases that they make.</li> <li>You use the RVS Production environment to verify receipts.</li> </ul> <h3 id="production-mode">Production mode</h3> <p>After you publish the app, the app runs in production mode.</p> <ul> <li>The IAP API requests from the app will interact with the live Amazon Appstore.</li> <li>You use the RVS Production environment to verify receipts.</li> <li>Any In-app purchases (that are not free) are charged to the user.</li> </ul> <h2 id="suggested-testing-process">Suggested testing process</h2> <p>If you're using the Appstore SDK for IAP, you can use the Amazon test tools and services in the following order to ensure that IAP is functioning correctly in your app before you publish the app to the Amazon Appstore.</p> <ol> <li> <p>Download and install the App Tester. For details, see <a href="../in-app-purchasing/iap-install-and-configure-app-tester.html">Installing and Configuring the App Tester</a>.</p> </li> <li> <p>Use App Tester to perform unit testing of the IAP API method calls in your app. For instructions on using App Tester, see the <a href="../in-app-purchasing/iap-app-tester-user-guide.html">App Tester User Guide</a>. For help with creating tests cases, see <a href="../in-app-purchasing/iap-design-test-cases.html">Designing and Executing Test Cases for IAP</a>.</p> </li> <li> <p>Set up the Receipt Verification Service (RVS) sandbox environment. For instructions, see <a href="../in-app-purchasing/rvs-cloud-sandbox.html">Use RVS Cloud Sandbox</a>.</p> </li> <li> <p>Configure your server to use the RVS sandbox environment. Verify the receipts generated by your app via App Tester.</p> </li> <li> <p>Submit your in-app items to the Amazon Appstore for publication. For instructions, see <a href="../in-app-purchasing/iap-create-and-submit-iap-items.html">Create and submit IAP items</a>.</p> </li> <li> <p>Select a group of users to participate to beta test your app in a production environment through Live App Testing. For information on Live App Testing, see <a href="../app-testing/live-app-testing-understanding.html">Understanding Live App Testing</a>.</p> </li> <li> <p>After your app is published, verify purchase receipts from your app using the RVS production environment. For an overview of RVS, see <a href="../in-app-purchasing/rvs-overview.html">Receipt Verification Service Overview</a>.</p> </li> </ol> <hr> <p id="tech-docs-updated-date"><small><i>Last updated: Oct 10, 2024</i></small></p> </div> </div> </div><!--/.container--> </div><!--/.page-container--> <style> .dpFooter .dpfNav { min-height: 220px; } </style> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/search-fullpage.css"> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/js/unload.js"> </div> <section class="dp-content-slot dp-content-pixel-tracker-slot"> <div class="dp-content-slot-inner container"> </div> </section> <footer class='dpFooter'> <a class='dpfBackToTopLink' href='#'>Back to top</a> <nav class="dpfNav accordion clearfix"> <div class='dpfWidth'> <div class='dpfnHideRightMargin'> <div class='dpfnColWrap'> <div class="dpfnCol"> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Resources</h3> <ul> <li><a href="/apps-and-games/blogs">Appstore Developer Blog</a></li> <li><a href="/apps-and-games/documentation">Technical Documentation</a></li> <li><a href="/apps-and-games/devhuddle">Amazon Developer Huddle</a></li> </ul> </div> </div> <div class="dpfnCol"> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Supported devices</h3> <ul> <li><a href="/apps-and-games/fire-tv">Amazon Fire TV</a></li> <li><a href="/apps-and-games/fire-tablets">Fire tablets</a></li> </ul> </div> </div> </div> <div class='dpfnColWrap'> <div class="dpfnCol"> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Other services & APIs</h3> <ul> <li><a href="/apps-and-games/small-business-program">Small Business Accelerator Program</a></li> <li><a href="/docs/reports-promo/promo-overview.html ">Developer Promotions Console</a></li> <li><a href="/apps-and-games/alexa-for-video-publishers">Alexa for video publishers</a></li> <li><a href="/apps-and-games/login-with-amazon">Login with Amazon</a></li> <li><a href="/docs/amazon-data-portability/overview.html">Amazon Data Portability</a></li> <li><a href="/frustration-free-setup">Frustration-Free Setup</a></li> <li><a href="/incentives-api">Amazon Incentives API</a></li> <li><a href="/apps-and-games/merch">Amazon Merch on Demand</a></li> <li><a href="/docs/music/landing_home.html">Amazon Music</a></li> </ul> </div> </div> <div class="dpfnCol"> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Support</h3> <ul> <li><a href="https://community.amazondeveloper.com/">Appstore Developer Community</a></li> <li><a href="/docs/app-submission/faq-landing.html">FAQs</a></li> <li><a href="/support/contact-us">Contact Us</a></li> </ul> </div> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Legal</h3> <ul> <li><a href="/terms-and-agreements">Terms & Agreements</a></li> <li><a href="https://www.amazon.com/gp/help/customer/display.html?nodeId=GX7NJQ4ZB8MHFRNJ">Privacy Notice</a></li> </ul> </div> </div> </div> </div> </div> </nav> <div class="dpfSocialLocal clearfix"> <div class='dpfWidth'> <div class='dpfLocale'> <nav class="dpLangSwitcher dpsfFlyout"> <span class='dplsTitle'>Language</span> <div class='dplsSwitch'> <span class="dplsCurrent dpsfFlyoutCurrent"> <i class='dpsfIcon dpsfIconGlobe'></i> English </span> <div class='dplsOptionsWrap dpsfFlyoutWrap'> <ul class="dplsOptions dpsfFlyoutContent"> <li class="dplsOption dpsfFlyoutItem dplsOptionActive"> <a data-locale="en_US" href="/docs/in-app-purchasing/iap-testing-overview.html"> English </a> </li> <li class="dplsOption dpsfFlyoutItem "> <a data-locale="zh_CN" href="/zh/docs/in-app-purchasing/iap-testing-overview.html"> Chinese (中文) </a> </li> <li class="dplsOption dpsfFlyoutItem "> <a data-locale="ja_JP" href="/ja/docs/in-app-purchasing/iap-testing-overview.html"> Japanese (日本語) </a> </li> </ul> </div> </div> </nav> </div> <div class="dpfSocial"> <span class="dpfSocialTitle"> Follow Us: </span> <a href="https://www.youtube.com/channel/UCT9ApARFgQJOeqD-ygmxnJQ"> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logo-youtube.png" alt="youtube_icon"/> </a> <a href="https://www.linkedin.com/showcase/amazon-appstore-developers"> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logo_linkedin._CB1704305834_.png" alt="linkedin_icon"/> </a> <a href="https://www.twitter.com/AmazonAppDev"> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logo_X.png" alt="X_icon"/> </a> <a href="https://www.facebook.com/AmazonAppDev"> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logo_facebook02.png" alt="facebook_icon"/> </a> <a href="/apps-and-games/blog"> <img src="https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/logo-blog._V290989945_.png" alt="blog_icon"/> </a> </div> </div> </div> <div class="dpfAreaOfInterest dpsfFlyout"> <span class='dpfaCurrent'> <i class='dpsfIcon dpsfIconDots'></i> </span> <div class="dpfWidth dpsfFlyoutWrap"> <div class="dpfaItems dpsfFlyoutContent"> <h3><hza:string id="area_of_interest_title" /></h3> <div class="dpfaItem dpsfFlyoutItem"> <a href="/alexa"> <span class='dpfaiText'>Alexa</span> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/platform-logos/white/Alexalogoheaderwhite._V506548913_.png" alt="Alexa" /> </a> </div> <div class="dpfaItem dpsfFlyoutItem"> <a href="/apps-and-games"> <span class='dpfaiText'>Amazon Appstore</span> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/platform-logos/white/Appstorelogowhite.png" alt="Amazon Appstore" /> </a> </div> <div class="dpfaItem dpsfFlyoutItem"> <a href="https://aws.amazon.com"> <span class='dpfaiText'>Amazon Web Services</span> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/platform-logos/white/AWS_logo_RGB_WHT._CB1506540482_.png" alt="Amazon Web Services" /> </a> </div> </div> </div> </div> <div class="dpfCopyright"> © 2010-2025, Amazon.com, Inc. or its affiliates. All Rights Reserved. </div> </footer> </div></body> <!-- Google Tag Manager (noscript) --> <noscript><iframe sandbox src="https://www.googletagmanager.com/ns.html?id=GTM-5LVXJD4" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> </html>

Pages: 1 2 3 4 5 6 7 8 9 10