Application Lifecycle Management (ALM) APIs
ALM APIs provide simple APIs to manage deployment of your SharePoint Framework solutions and add-ins across your tenant. ALM APIs support the following capabilities:
- Add SharePoint Framework solution or SharePoint Add-in to tenant or site collection app catalog.
- Remove SharePoint Framework solution or SharePoint Add-in from tenant or site collection app catalog.
- Enable SharePoint Framework solution or SharePoint Add-in to be available for installation in tenant or site collection app catalog.
- Disable SharePoint Framework solution or SharePoint Add-in not to be available for installation in tenant or site collection app catalog.
- Install SharePoint Framework solution or SharePoint Add-in from tenant or site collection app catalog to a site.
- Upgrade SharePoint Framework solution or SharePoint Add-in to a site, which has a newer version available in the tenant or site collection app catalog.
- Uninstall SharePoint Framework solution or SharePoint Add-in from the site.
- List all and get details about SharePoint Framework solutions or SharePoint Add-ins in the tenant or site collection app catalog.
ALM APIs can be used to perform exactly the same operations that are available from a UI perspective. When these APIs are used, all typical actions are performed. Following are some of the characteristics of ALM APIs:
Install
andUnInstall
events are being fired for provider-hosted add-ins when corresponding operations occur.- ALM APIs support app-only-based operations for SharePoint Framework solutions only.
ALM APIs are supported for the tenant-scoped site collections and site collection app catalog. Use the corresponding app catalog's URL to target a specific app catalog. You must first enabled a site collection app catalog before targeting it with the actions documented on this page.
Important
Tenant-scoped permissions which require tenant administrative permissions are not supported with the ALM APIs.
Options for working with ALM APIs
ALM APIs are natively provided by using REST APIs, but there are additional client-side object model (CSOM) extensions, PowerShell cmdlets, and the cross-platform CLI for Microsoft 365 available through SharePoint PnP Community channels.
SharePoint REST API
The ALM APIs are natively provided as endpoints on the SharePoint REST API.
The app catalog must be included in all HTTP requests when using the REST API as shown in the examples below. Replace the {app-catalog-scope}
placeholder in the endpoint with the scope of the app catalog. The available scope options are tenantappcatalog
and sitecollectionappcatalog
.
For example:
Scope | Endpoint |
---|---|
tenant | https://contoso.sharepoint.com/sites/AppCatalog/_api/web/tenantappcatalog/{command} |
site collection | https://contoso.sharepoint.com/sites/Marketing/_api/web/sitecollectionappcatalog/{command} |
- when targeting the tenant app catalog located at
https://contoso.sharepoint.com/sites/AppCatalog
, the endpoint would be **
Learn more here: SharePoint REST API
PnP CSOM (also known as: PnP Sites Core)
The PnP CSOM implements the ALM APIs by calling the SharePoint REST API.
Before using any of the ALM APIs in PnP CSOM, you need to obtain an authenticated client context using the Microsoft.SharePointOnline.CSOM. Then use the authenticated client context to get an instance of the PnP CSOM's AppManager object to call the ALM commands:
using Microsoft.SharePoint.Client;
using OfficeDevPnP.Core.ALM;
// ...
using (var context = new ClientContext(webURL)) {
context.Credentials = new SharePointOnlineCredentials(username, securePassword);
var appManager = new AppManager(context);
// execute PnP CSOM ALM command
}
In all PnP Core methods, it's assumed the request targets the tenant app catalog in the tenant you connect to using the SharePoint CSOM ClientContext
object. you can override the scope of all commands with an optional scope argument, for example
appManager.Install('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx', AppCatalogScope.Site);
Learn more here: PnP PowerShell
PnP PowerShell
PnP PowerShell implements the ALM APIs by calling the PnP CSOM.
Before using any of the cmdlets in the PnP PowerShell module, you must first connect to SharePoint Online using the Connect-PnPOnline
cmdlet.
In all PnP PowerShell cmdlets, it's assumed the request targets the tenant app catalog in the tenant you connect to using the Connect-PnPOnline
cmdlet. You can override the scope of the command using the -Scope
parameter to target a site collection app catalog.
Learn more here: PnP PowerShell
Note
PnP PowerShell is an open-source solution with active community providing support for it. There is no SLA for the open-source tool support from Microsoft.
CLI for Microsoft 365
The CLI for Microsoft 365 is a cross-platform command-line interface that can be used on any platform, including Windows, macOS, and Linux. The CLI implements the ALM APIs by calling the SharePoint REST API.
Before using any of the commands in the CLI for Microsoft 365, you must first connect your Microsoft 365 tenant using the m365 login
command.
Learn more here: CLI for Microsoft 365
Note
The CLI for Microsoft 365 is an open-source solution with active community providing support for it. There is no SLA for the open-source tool support from Microsoft.
Add solution package
First add an app package (*.sppkg or *.app) to an app catalog in order to make it available to SharePoint sites.
HTTP request
POST /_api/web/{scope}appcatalog/Add(overwrite=true, url='sharepoint-solution-package.sppkg')
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
Content-Type | application/json |
X-RequestDigest | {form digest} |
binaryStringRequestBody | true |
Request body
Byte array of the file
Deploy solution packages
Deployment of the solution makes it available to install in sites.
HTTP request
POST /_api/web/{scope}appcatalog/AvailableApps/GetById('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx')/Deploy
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
Content-Type | application/json;odata=nometadata;charset=utf-8 |
X-RequestDigest | {form digest} |
Request body
{
"skipFeatureDeployment": true
}
Note
This operation can only be completed after calling the Add
endpoint and before you can install packages to specific sites.
Important
Deploying multiple packages in parallel is not supported. Make sure to serialize your deployment operations to avoid deployment errors.
Retract solution packages
This is the inverse of the deploy step above. Once retracted, the solution can't be installed in sites.
HTTP request
POST /_api/web/{scope}appcatalog/AvailableApps/GetById('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx')/Retract
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
X-RequestDigest | {form digest} |
Note
This operation will block installing the solution in sites and disable existing installations.
Remove solution packages
This is the inverse of the add step above. One removed from the app catalog, the solution can't be deployed.
HTTP request
POST /_api/web/{scope}appcatalog/AvailableApps/GetById('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx')/Remove
Note
If the Retract operation is not performed before the Remove operation, the solution is automatically retracted.
List available packages
This operation will return a list of all available SharePoint Framework solutions or add-ins in the app catalog.
HTTP request
GET /_api/web/{scope}appcatalog/AvailableApps
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
Response
{
"value": [
{
"AadAppId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"ContainsTenantWideExtension": false,
"CurrentVersionDeployed": true,
"Deployed": true,
"ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"IsClientSideSolution": true,
"IsEnabled": true,
"IsPackageDefaultSkipFeatureDeployment": false,
"IsValidAppPackage": true,
"ShortDescription": "",
"SkipDeploymentFeature": false,
"Title": "sharepoint-solution-package"
},
{
"AadAppId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"ContainsTenantWideExtension": false,
"CurrentVersionDeployed": true,
"Deployed": true,
"ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"IsClientSideSolution": true,
"IsEnabled": true,
"IsPackageDefaultSkipFeatureDeployment": false,
"IsValidAppPackage": true,
"ShortDescription": "",
"SkipDeploymentFeature": false,
"Title": "sharepoint-solution-package2"
}
]
}
Get a specific solution
This action will return details about a specific SharePoint Framework solution or add-in available in the app catalog.
HTTP request
GET /_api/web/{scope}appcatalog/AvailableApps/GetById('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx')
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
Response
{
"AadAppId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"ContainsTenantWideExtension": false,
"CurrentVersionDeployed": true,
"Deployed": true,
"ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"IsClientSideSolution": true,
"IsEnabled": true,
"IsPackageDefaultSkipFeatureDeployment": false,
"IsValidAppPackage": true,
"ShortDescription": "",
"SkipDeploymentFeature": false,
"Title": "sharepoint-solution-package"
}
Install solution package in a site
Install a solution package with a specific identifier from the app catalog to the site based on URL context.
HTTP Request
POST /_api/web/{scope}appcatalog/AvailableApps/GetById('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx')/Install
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
X-RequestDigest | {form digest} |
Upgrade installed solution packages
Upgrade a solution package from the site to a newer version available in the app catalog.
HTTP request
POST /_api/web/{scope}appcatalog/AvailableApps/GetById('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx')/Upgrade
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
X-RequestDigest | {form digest} |
Uninstall solution packages from a site
This action is the inverse of the install command above.
Note
When you use the uninstall a solution package from the site with any of the methods below, it's permanently deleted; it'sn't placed in the recycle bin.
HTTP request
POST /_api/web/{scope}appcatalog/AvailableApps/GetById('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx')/Uninstall
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
X-RequestDigest | {form digest} |
Synchronize a solution to the Microsoft Teams app catalog
This action requires that you refer the list item ID of the solution in the app catalog site.
HTTP request
POST /_api/web/{scope}appcatalog/SyncSolutionToTeams(id=xxxxx)
Request headers
Header | Value |
---|---|
Authorization | Bearer {token} |
Accept | application/json;odata=nometadata |
X-RequestDigest | {form digest} |