Click here to Skip to main content
Click here to Skip to main content

Analyze and start using API of SharePoint App Store to collect data about apps.

, 15 Jul 2014
Rate this:
Please Sign up or sign in to vote.
SharePoint App Store already exists for two years, but there are not so much apps published yet and quality of existing apps is questionable. Nonetheless App store and Office 365 platform are evolving and new apps appear every month. This article is the first in the cycle of articles about analyzing

SharePoint App Store already exists for two years, but there are not so much apps published yet and quality of existing apps is questionable. Nonetheless App store and Office 365 platform are evolving and new apps appear every month. This article is the first in the cycle of articles about analyzing SharePoint App store using API. During this cycle I will show how to access data about popularity of each app in the store.

There are not open documentation for SharePoint App Store API and in this article I will show how to research SharePoint App Store API and how to start using it.
 

How to research API of SharePoint App Store

To access SharePoint store you need to open your SharePoint Online, click ‘gears’ icon in the right top corner and click ‘Add an App’ in the menu. Then in the left menu click ‘SharePoint Store’.

Note, even if you navigate to different apps within store, the URL of store is always the same and looks like this:

/_layouts/15/storefront.aspx?source={WebUrl}&sname=Demo

Only GET parameters can be different. Thus, we can assume that most of server side functionality is in this page. SharePoint 2013 is very similar to SharePoint Online and we can find storefront.aspx page in the _laouts folder on the WFE server of on-premise environment. The full path usually looks like this:

c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\LAYOUTS\Storefront.aspx

If you look at the source code of this page you can see following string:

<%@ Assembly Name="Microsoft.SharePoint.ApplicationPages" %> <%@ Page Language="C#" Inherits="Microsoft.SharePoint.ApplicationPages.StorefrontPage"       %>

Pay attention to highlighted text, this is the name of C# class. Next step is to open my favorite tool ILSpy (.NET decompiler) and find our class. Firstly you need to load assembly from the _app_bin folder of your SharePoint web application, then find class using search. The path to assembly on WFE is following: c:\inetpub\wwwroot\wss\VirtualDirectories\80\_app_bin\Microsoft.SharePoint.ApplicationPages.dll
Where 80 is the number of port for your web application.

First of all this class is inherited from StorefrontBase class which contains all logic for app installation. I will not describe this class here, it can take more that one article. In this article we are actually interested in OnPreRender method in which we see inclusion of javascript file SP.Storefront.js.
 


Let us find SP.Storefront.debug.js file. There are a lot of JS code which is responsible for html generation and data visualization. This is quite difficult to understand how this script actually works. I used Fiddler web debugging tool to analyze HTTP requests. This helped me to understand what methods are used in this JS file.

As it turned out the page storefront.aspx returns JSON which depends on request parameter 'task', if we dig deeper in the SP.Storefront.js  file we will find calls of these methods and their parameters. These calls are located between 6741 and 6870 lines. You can see example of GetApps method call from SP.Storefront.debug.js below:

function SP_Storefront_StorefrontProxy$beginGetApps($p0, $p1, $p2, $p3, $p4, $p5, $p6, $p7) {
    this.$v_1();
    SP.Storefront.StorefrontProxy.$Z(this.$2C_1);
    var $v_0 = SP.Storefront.StorefrontProxy.getPageServerRelativeUrl();
    $v_0.addKeyValueQueryString('task', 'GetApps');
    $v_0.addKeyValueQueryString('bm', $p0);
    $v_0.addKeyValueQueryString('cm', $p1);
    $v_0.addKeyValueQueryString('category', $p2);
    $v_0.addKeyValueQueryString('free', $p3);
    $v_0.addKeyValueQueryString('sort', $p4);
    $v_0.addKeyValueQueryString('query', $p5);
    $v_0.addKeyValueQueryString('catalog', $p6.toString());
    var $v_1 = SP.Storefront.StorefrontProxy.$2B($p7, false);
    var $v_2 = $v_0.get_url();
    this.$2C_1 = this.startRequest($v_2, null, $v_1, this.$$d_$4W_1, this.$$d_$4V_1);
}


I researched code around GetApps method in the JS file and found other mehtods which potentially can be helpful. This is a list of methods with description:

  • GetApps – Returns basic information about first 240 apps
  • GetCategories – Returns information about categories
  • GetAppDetails – Returns detailed information about app
  • GetAppReviews – Returns users’ review by app
  • GetOfficeMarkets – Returns list of available languages and currencies
  • GetAppPrice – Returns app price that depends on chosen license type
  • GetPromotedApps – Returns list of featured apps
  • GetMyApps – Returns list of apps that available for installation on appanapp.aspx page
  • GetMyNewApps – Returns list of installed apps (it is used on addanapp.aspx page)

After some analysis of JS methods I found that they actually call API. All of them call GET requests with tasks parameter. I’m interested in the first three methods especially, because they allow to get general statistics about apps in the SharePoint Store. I collected more information about these methods and you can find description of API for the first three methods below:

GetApp

Parameter Example Description
Task GetApps Correspond to JS method
Bm US Currency
cm EN-SG Current locale
category Communication Currency
free 0 Filter by free
sort 7 1 - Newest
2 – Most downloaded
3 - ? (I didn’t find what is this)
4 - Lowest Price
5 – Highest Rating
6 – Name
7 – Most Relevant
query   Search query
catalog 0 Always 0 for Online Store
uci   ?


Example of request:
GET /_layouts/15/storefront.aspx?task=GetApps&bm=US&cm=EN%2DSG&category=&free=0&sort=7&query=&catalog=0&uci= 

Example of JSON result:

[{
    "Title": "Accesa Process Management",
    "ThumbnailUrl": "http:\/\/az158878.vo.msecnd.net\/marketing\/Partner_21474839693\/Product_42949674953\/Asset_eb5dc7f7-1ef0-4903-977f-0229126041f1\/APMlogo96.png",
    "AssetId": "WA104128234",
    "Publisher": "ACCESA IT CONSULTING SRL",
    "ShortDescription": "Enhance the flow of processes managed through SharePoint",
    "Price": "Free",
    "PriceType": 0,
    "PricePromotion": "",
    "Rating": 0,
    "Votes": 0,
    "Version": "1.1.0.3",
    "Catalog": "0",
    "CategoryID": "Productivity,Workflow + Process Management,Look & Feel",
    "PreRequisites": "",
    "FirstScreenshot": "http:\/\/az158878.vo.msecnd.net\/marketing\/Partner_21474839693\/Product_42949674953\/Asset_57fa2d0e-84a7-428c-b07d-01593311bd20\/1accesaprocessmanagement.png",
    "PrerequisitesMet": "True"
}]

GetCategories

Parameter Example Description
Task GetCategories Correspond to JS method
Bm US Currency
cm EN-SG Current locale
catalog 0 Always 0 for Online Store

Sample of request:
GET /Demo4/_layouts/15/storefront.aspx?task=GetCategories&bm=US&cm=EN%2DSG&catalog=0

Example of JSON result:

[
    {
        "ID": "Communication",
        "Title": "Communication"
    }
]

GetAppDetails

Parameter Example Description
Task GetAppDetails Correspond to JS method
Bm US Currency
cm EN-SG Current locale
appid WA104231938 App asset ID
catalog 0 Always 0 for Online Store


Sample of request:
GET /_layouts/15/storefront.aspx?task=GetAppDetails&bm=US&cm=EN%2DSG&appid=WA104231938&catalog=0

Example of JSON result:

{
    "BasicDetails": {
        "AssetId": "WA104231938",
        "Catalog": "0",
        "CategoryID": "Productivity,Content Management,Workflow + Process Management",
        "License": {
            "IsExpired": "False",
            "IsTokenExpired": "False",
            "LicenseType": 1,
            "MaxUserCount": -1,
            "PurchaserId": "069D917EAE472DD5",
            "RemainingDays": -1000,
            "SubscriptionStatus": "0"
        },
        "PreRequisites": "",
        "PrerequisitesMet": "True",
        "Price": "Free",
        "PricePromotion": "",
        "PriceType": 0,
        "ProductId": "{69d11d91-ebf8-4e0e-afd5-82c90cc6a02b}",
        "Publisher": "Fuzor LLC.",
        "Rating": 100,
        "ShortDescription": "Design SharePoint forms with tabs, complex tables and accordions directly in the browser",
        "ThumbnailUrl": "http://az158878.vo.msecnd.net/marketing/Partner_21474838730/Product_42949675832/Asset_ed684eaf-3b42-4cc3-a7dd-5ab106cc376a/AppIcon.png",
        "Title": "Plumsail Forms Designer",
        "Version": "2.8.9.0",
        "Votes": 4
    },
    "Description": "By using this tool you will be able to create rich well-styled forms without programming skills. It allows to customize all types of forms in lists, external lists and document libraries. \n\nSetup properties to customize the design of controls and fields according to your needs and the company's brand book. You can hide labels of fields or distribute them vertically, change the size of table cells and titles, make fields read-only, define additional CSS-styles or override defaults.\n\nMake your form dynamic with JavaScript. Plumsail Forms Designer provides rich JavaScript framework based on JQuery library that allows you to add a validation, a conditional visibility, an autofilling and other features in a short time.\n\nGet started with a fully featured free 15-day trial now! For more details, visit spform.com.",
    "Downloads": 272,
    "EulaUrl": "http://o15.officeredir.microsoft.com/r/rlidMktplcPUXTermsConditions?clid=18441",
    "ImageUrls": [
        "http://az158878.vo.msecnd.net/marketing/Partner_21474838730/Product_42949675832/Asset_62b62946-ad9f-4bca-b5c7-65978eccbdc7/1.PNG",
        "http://az158878.vo.msecnd.net/marketing/Partner_21474838730/Product_42949675832/Asset_8f801bb3-fe1b-44b2-bf48-e71b8aea3698/2.PNG",
        "http://az158878.vo.msecnd.net/marketing/Partner_21474838730/Product_42949675832/Asset_f34b09aa-97c5-4616-bbd6-7f8063b2f9dc/3.png",
        "http://az158878.vo.msecnd.net/marketing/Partner_21474838730/Product_42949675832/Asset_922d7ea7-cea1-4de0-8258-1b1757f89314/4.PNG",
        "http://az158878.vo.msecnd.net/marketing/Partner_21474838730/Product_42949675832/Asset_3f564518-6f7e-4178-bbd1-3db4186f71d4/5.PNG"
    ],
    "IsSupportedMarket": "True",
    "ManageableLicense": {
        "IsExpired": "False",
        "IsTokenExpired": "False",
        "LicenseType": 1,
        "MaxUserCount": -1,
        "PurchaserId": "069D917EAE472DD5",
        "RemainingDays": -1000,
        "SubscriptionStatus": "0"
    },
    "PriceModel": 0,
    "PricePercentOff": "",
    "PriceValue": "0.0",
    "PrivacyUrl": "http://plumsail.com/store/privacy-policy/",
    "PublisherUrl": "http://plumsail.com",
    "ReleasedDate": "March, 2014",
    "SiteLicensePrice": "",
    "SiteLicenseSeats": 0,
    "State": 1,
    "SubType": 5,
    "SupportUrl": "http://spform.com",
    "SupportedLocaleNames": "English (United States)",
    "Tax": "False",
    "Trial": 0,
    "TrialLength": 0,
    "TrialUsers": 0,
    "UnsafeVersion": "",
    "VideoUrl": "http://www.youtube.com/user/spform"
}

Conclusion

In this article I showed general algorithm of researching SharePoint App Store API. ILSpy and Fiddler can provide huge assistanse in this task. Also I briefly described existing API of SharePoint Store. In the next article I plan to collect data about popularity of separate apps in SharePoint App Store using this API. Should you have any questions, feel free to comment.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Anton Khritonenkov
Technical Lead
Russian Federation Russian Federation
Microsoft certified SharePoint expert with more than 5 year of IT experience. My priority is the design and development of simple, convenient and flexible products.
 
Specialties: SharePoint 2010/2013, Office 365, Project management, Business Intelligence, ASP.NET, C#, Silverlight (MVVM), Windows Workflow Foundation, BPMN, XSL, JavaScript, CSS, MS SQL 2005-2012.
Follow on   Twitter

Comments and Discussions

 
-- There are no messages in this forum --
| Advertise | Privacy | Mobile
Web02 | 2.8.140721.1 | Last Updated 15 Jul 2014
Article Copyright 2014 by Anton Khritonenkov
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid