This checklist is designed to help you prepare your app for the Spotify Apps Approval Process. Make sure that your app passes all these test before submitting it for approval.

Important Notice for Spotify Apps Partners
We no longer accept new apps for distribution within our Spotify Desktop Player. (You can, of course, still develop Spotify Apps for private use.) Existing Spotify Apps partners may continue to maintain their apps and provide critical updates. For more information, please see our news announcement Closure of Spotify Apps Submissions.

Before Starting App and Manifest Check

What to Test
How to Test
The app name* Don’t use the suffix “-ify”
* Don’t use the prefix “Spot-”
App folder nameThe name of zipped app folder should:
* be an exact match to that of the BundleIdentifier
* be in lower case
* not contain any other letters than those in the BundleIdentifier. For example, if the BundleIdentifier is “jam” then the app folder name should be “jam”, and not “jam app 1.0.2″.
App file namesFor technical reasons, all app file names must be in lower case.
AppDescriptionAppDescription should be:
* Maximum 60 characters.
* Localized
* All languages listed needs to have the appropriate language tags, for example: de, en, es, fr, nl.
AppIconCheck that all image sizes are correct:
* 36×18 The sidebar app icon should have one normal and one inverted state.
* 64×64
* 128×128
* 300x300
* No images should be smaller than 18×18
* DON’T FORGET:Check these icons in app bundle!
AppName* A dictionary with localized user-displayable names for your application, e.g. My Application
* Must be localized
* All languages listed need to have the appropriate language tag, for example: de, en, es, fr, nl
BundleIdentifier* Should be short and simple and NOT contain the word “spotify”
* Must be in lower case and be an exact match to that of the name of the zipped app folder
* The characters allowed in the manifest are a-z, 0–9 and ‘-’
BundleTypeMust be “Application”.
BundleVersionShould follow semantic versioning format (MAJOR.MINOR.BUGFIX),
e.g. 1.0.0 and be updated increasingly for each version.
See for reference.
SupportedLanguagesA list of languages that the application is localized in.
All languages listed needs to have the appropriate language tags, for example: de, en, es, fr, nl.
RequiredInterface* IF this is declared, must always contain the value 1.
* Should NOT be in quotation, then the 1 is parsed as a string.
VendorIdentifierRequires a reverse format. e.g. com.spotify (not
RequiredPermissionsIF this is declared, it cannot contain wildcard domains WITHOUT A DOT after the asterisk:
“*” is OK.
“*” is NOT OK.

* Do not use broad wildcards like *.com
* UNSPECIFIED WILDCARD domains is also not allowed, e.g. “http://*.*”
* You should use https in the required permissions.
* The domain must be belong to a valid top-level domain (e.g.,, not localhost nor an IP address)
* The individual permissions should be specific to a subdomain or set of subdomains.
Aquiring resources* Dependencies should be declared.
* Shortened way of referencing to resources should be used.

* In order for the app to be compatible with the new Spotify API, you should declare which versions of the API you’re using in the manifest and properly link to resources for images and css. References to the new API can be found here:

* When adding Dependencies to the manifest, the API should be called using $api instead of sp://… In connection to that, the import folder should not be used. Instead you should change it to “resources”. For example, sp://import/img/image-name.png should be sp://resources/img/image-name.png

* Make sure that you do not refer to the import folder. Instead you should use resources. For example: sp://import/img/scrollbars/light/corner.png shoule be sp://resources/img/scrollbars/light/corner.png.

Read more in our blog post.
Google Analytics* Do not use Google’s Web tracking API directly.
* Do not refer to googletracker.js.


Performance and Security

What to Test
How to Test
Errors on consoles
* No HTML/JS land errors should be displayed in the inspector (right-click and select show inspector to invoke it)
* App should not violate the sandbox, exceptions are thrown (etc) should not be displayed in the Spotify application’s console

* Inspector Console: Can be viewed by rightclicking the app are –> Show Inspector –> Console
* Spotify Console: Can be viewed via Terminal.on Mac OS X, and using Spotify’s internal console on Windows (press Ctrl+Alt+Home when Spotify is in focus to invoke it)
Memory & CPU* Memory usage should not exceed 500 000 K
* CPU usage should stay below 25%
* There should be no sudden increase in CPU usage when the app is passive
Performance* The app should not crash
* The app should not end up in eternal loading
Loading timesLoading times should be reasonably fast compared to other apps and the Spotify client.
ThrobberSpotify native throbber should be used to indicate when something is loading.
Client resizing*The app should handle client resizing (elements align and overlap appropriately, functionality isn’t compromised)
*The app handles small screen resolutions as well as large
* The app handles the minimum width of 640px
Adjustment to adsUse the realtime vocal ads on a free account:
* Check that you can’t skip tracks during vocal ads
* Check that the app doesn’t break or behave strangely during and after vocal ads
Input tests* Enter script injections into any and all input fields (search-boxes etc.)
* If entering “<!–this–>that” only shows you “that” means the string is parsed as HTML = bad
* If entering “<script>alert(0);</script>” shows you a popup containing “0″ the string is parsed as HTML = bad
* For security reasons, instead of using strip_tags(), html-escaping should be used
Large Scale TestingTest for a lot of data being loaded into the app:
* Add large playlists (~1000 tracks) and see how the app handles this
* Run the app with an account that has hundreds or even thousands of friends
Operating systemsWorks on both PC and Mac.


Native UI

What to Test
How to Test
TabsIf tabs are used, it’s the standard Spotify tabs (defaultTabs or TabBar).
Branded area
* The branded area (logo/header) shouldn’t be higher than 60 pixels
* IF used as a link, it should point at the app root rather than to a website
* IF you have a link to your website, this should preferably not be in the header
Track listingStandardized Spotify track listing components should be used.
ButtonsWhenever possible, use the Spotify standard buttons
such as “+ Follow”, “Show all tracks” buttons.
Adding or FollowingThere should only be one option of either “Add as playlist” or “Follow”.
Not both, since they are different types of actions.
Multiple playlist adding* It should not be possible to add the same playlist multiple times
* The Add as playlist button should disappear when clicked and return when the app is reloaded
* The Follow button should change state to Following
Cover artWhen cover art larger than 40×40 is hovered, it should display a play button.
Overlay play button* When hovering a paused button image, it should change to the play icon
* The Pause icon should not be visible when NOT hovering the image
* When playing, the button image should be a speaker with the volume bar present
* When hovering a playing button, it should change to the pause icon
Mouse cursorMouse cursor should be:
* pointing hand when hovering the album art
* arrow cursor when hovering the play button
When pointing to another view inside the app or to an external website, cursor should be a pointing hand.
When not changing views with the mouse, cursor should be an arrow.
Drop-down menusDrop-down menus should disappear when clicking anywhere outside them.
Sticky footersDon’t use a footer that sticks to the bottom of the page, if it’s not 100% vital for app function.
Nested scrollbars* Don’t use nested scrollbars (scrollbars within scrollbars), if it’s not 100% vital for app function
* Do use a Show more/show less button instead of nested scrollbars


Native Functions

What to Test
How to Test
Offline Mode* No content of the app should be accessible during Offline Mode or in disconnected state.
* When back online, the app should restore its last state.
Playlist generators* If the user can add and remove tracks to a playlist, check that you can only add as many tracks as intended
* If you add 100+ tracks, check what happens with the graphics
* If you remove tracks, check that the track numbers update correctly
Draggable images* Images/icons that are not connected to any playlists or that can’t be used for a search, should not be draggable.
* What is “caught” by the cursor should only be the URI tooltip.
* OK: Album/track/artist URI is draggable.
* NOT OK: Image attached to album/track/artist URI is draggable.
Draggable URI:sWhen dragging Spotify URI:s into search fields:
* Can you use them in any logical manner, ie can you listen to the track?
* Do you get a valid search result? If not, then they should not be draggable.
Image and Link Navigation* When clicking on an Album or Artist image, the image should take you to the corresponding Native Album/Artist page in Spotify
* Clicking a track/album/artist link opens the corresponding Spotify page. No track starts playing
* Links are underlined on mouse hover
* IF you have your own Spotify playlist page, track/album/artist link or Album Image can link here. From this page you can then link out to your own website
Unavailable track handling* If you use Views Framework, unavailable tracks will be handled automatically by Spotify
* Unavailable tracks should be skipped by the app and next track should automatically play
* Press all play buttons to see that all tracks can be playable
* If you can’t change country, uncheck “Hide unplayable tracks” to see unavailable tracks
* Add unplayable tracks to a playlist and check that they are properly skipped
Spotify Back / Forward-buttons.Back/Forward buttons should work properly with the app:
Does clicking the Spotify “back” button take you to the view where you were before?
StarringDoes starring and unstarring work?


Content and Copy

What to Test
How to Test
User Generated ContentUser Generated Content (UGC) is generally not allowed.
Included but not limited to: user uploaded; audio, video, photos, lyrics, text, chat rooms, reviews, links to blogs, Wikipedia extractions or Twitter or Facebook feeds.
User Generated Content and saving* IF User Generated Content is allowed by Spotify, the UGC should be prompted to be saved.
* The user should not lose any content that they create. For example, the created playlist should not disappear when changing log-in state.
Amount of contentThe app should not look empty.
IF applicable, there should be a minimum total amount of at least 15 playlists, articles, reviews etc.
Missing contentIs there any missing content (missing text, cropped text etc)?
Special character encoding* Special characters should be supported: Öö & ´,’ ‘”\%;日本国, عَرَبيْ ʿ) Å äÄ å üÜ
* Does characters and symbols appear correctly when sharing to social media, on playlist names inside the app and other dynamic content?


External Media

What to Test
How to Test
Logging in and out* Log in, cancel login, log out, wrong password and username, input tests = should work
* When applicable, logging in with a second Facebook/Twitter (etc) account should work
Logout featureIF a logout button exists, place it:
* OK: close to profile information or in the footer
* NOT OK: in the logo header or navigation bar
Social media sharingChange share option to “only me”.
* Does sharing to social media work?
* How is shared content displayed on social media? Check with IE9
License agreement* Licence agreement checkboxes may not be checked by default
* Correct default legal agreement text should be used
External links* Don't use an excessive amount of external links
* Do the links work?
* Do the links point to the correct page?
* Are the links correctly displayed with external link icons?
* Mailto: links work and have the external link icon next to them
* Do links lead to pages with other music services than Spotify? Make sure that the app complies with our external link policy.

* Facebook and Twitter icons are OK to use without the external link icon.