Sharepoint Rest APIs does not work without FullControl permissions

Moheb Mithani 20 Reputation points
2026-08-12T06:56:57.3133333+00:00

I want to access RoleAssignments of a site or a file/folder via APIs. The graph apis does not support all features provided in sharepoint like inheritance breakage, RoleAssignment and Role Definition details hence i am using Rest apis for this purpose. I've created an Azure app with application permissions. Unless i don't give Sites.FullControl.All permission to the "Sharepoint" app, i can't access the required apis. I don't see any official literature to point out that we indeed need this permission, although there are several blogs which does states that. Can you please confirm following points?

  • Sharepoint Rest apis indeed need FullControl permission?
  • Why is that the case? why can't we use Read permissions if we just need to fetch the details

I'm also aware of Sites.Selected permissions but all it does is "scope the affected sites" not use less permission. Even with Sites.Selected, you need to grant full control permission to the resource(the site) and app(having Sites.Selected permission) using the /permission graph api right?

I'm using Thumbprint/Certificate option for authenticating and below are the exact apis i am using:

Rest APIS:
Tenant Settings like sharing capabilities = https://-admin.sharepoint.com_api/SPO.Tenant/sites
Roles Assignments For Sites/Subsites = /_api/web/roleassignments
Fetch Items in a drive = /_api/web/lists/GetById('...')/items(id)
Fetch Role Assignments of a drive item = /_api/web/lists/GetById('...')/items(id)/roleassignments
Microsoft 365 and Office | SharePoint | Development
0 comments No comments

Answer accepted by question author
Michelle Nguyen 1,180 Reputation points Independent Advisor
2026-08-12T08:26:35.52+00:00

Hi @Moheb Mithani

You are encountering two different authorization behaviors: ordinary SharePoint content APIs and SharePoint security or tenant-administration APIs. The short answer is that SharePoint REST does not universally require Sites.FullControl.All, but the specific permission-management and tenant-admin endpoints you are calling can require it in application-only scenarios.

  1. Does SharePoint REST require Sites.FullControl.All?

SharePoint REST API does not require Sites.FullControl.All for every operation. If an application only needs to read ordinary content such as sites, lists, list items, files, or folders, Sites.Read.All may be sufficient. If you want to restrict the application to specific sites, you can use Sites.Selected and grant the application the read role on each required site.

However, the endpoints you are using do not all belong to the same category. An endpoint that retrieves a list item, such as:GET /_api/web/lists/GetById('{listId}')/items({itemId})is an ordinary content-reading operation. Therefore, Sites.Read.All, or Sites.Selected combined with a site-specific read grant, will normally be sufficient.

In contrast, the roleassignments endpoints retrieve permission configuration, while the SPO.Tenant endpoint is a tenant-administration API. These operations can require more privileged permissions than ordinary content retrieval.

Ref: SharePoint admin APIs authentication and authorization

  1. Why is Read insufficient when you are only retrieving role assignments?

The key distinction is between:

  1. Reading the content of a site.
  2. Reading the security configuration protecting that content.

SharePoint treats RoleAssignments, RoleDefinitionBindings, unique permission scopes, and inheritance information as elements of its authorization system rather than ordinary content. A role assignment associates a principal with one or more role definitions on a securable object, such as a web, list, folder, or item.

This means: GET /_api/web/lists/GetById('{listId}')/items({itemId})is a content read, whileGET /_api/web/lists/GetById('{listId}')/items({itemId})/roleassignmentsis an ACL or security-descriptor read. The requested HTTP operation might be GET, but the returned information describes:

  • Which users and groups have access
  • Which role definitions are assigned
  • Whether the object has unique permissions
  • How access is inherited
  • Potentially, which identities have privileged access

SharePoint therefore does not map every HTTP GET operation to the Sites.Read.All permission. Authorization is based on the protected operation and resource, not merely the HTTP verb.

The same distinction exists in Microsoft Graph. Even Graph’s site-level permissions listing endpoint:GET /sites/{site-id}/permissionsdocuments Sites.FullControl.All as its least-privileged delegated and application permission. This is useful official evidence that Microsoft intentionally classifies permission enumeration as a highly privileged operation, even though it is read-only.

Ref: List permissions

Microsoft does not currently provide a comprehensive public endpoint-by-endpoint permission table for every legacy SharePoint REST route under /_api. Consequently, the requirement for /_api/.../roleassignments is less clearly documented than the requirement for SharePoint admin APIs.

Nevertheless, the observable behavior is consistent with Microsoft’s documented authorization model:

  • Content enumeration can use Read.
  • Permission enumeration is treated as privileged.
  • Tenant admin APIs require Full Control for app-only access.
  • Permission modifications, including breaking inheritance or adding role assignments, require permission-management rights. Microsoft’s REST example for setting custom permissions explicitly requires Full Control add-in permission at the web scope.

Ref: Set custom permissions on a list by using the REST interface

  1. Does Sites.Selected still require Full Control on the selected site?

No, not necessarily. This is the key correction to your understanding.Sites.Selected separates authorization into two dimensions:

  1. Which resources the application can access
  2. What role the application has on those resources

After granting Sites.Selected to the application in Entra ID, the application initially has access to no sites. It must then receive an explicit permission assignment for each selected site. Microsoft documents this as a multi-step model consisting of Entra consent, a resource-specific assignment, and a token containing the Selected scope. The site-specific role does not always need to be fullcontrol. Depending on the operation, the assignment can use:read write manage fullcontrol

Microsoft’s SharePoint guidance explicitly describes resource-specific consent as supporting read, write, manage, or full-control application-only access to selected site collections.

For example:

POST https://graph.microsoft.com/v1.0/sites/{site-id}/permissions
Content-Type: application/json
{
 "roles": ["read"],
 "grantedToIdentities": [
 {
 "application": {
 "id": "{target-app-client-id}",
 "displayName": "Role Assignment Reader"
 }
 }
 ]
}

However, there is an important practical point for your scenario:

If the SharePoint REST roleassignments endpoint requires Full Control, giving the application Sites.Selected plus a read site grant will not bypass that requirement.

In that case, the valid least-broad configuration is:

SharePoint application permission: Sites.Selected
Selected site assignment: fullcontrol

That is still substantially safer than:

SharePoint application permission: Sites.FullControl.All

because the first configuration limits Full Control to specifically assigned sites, while the second applies across all site collections in the tenant.

  1. What permission should you configure for your exact endpoints?

A. Tenant settings and tenant site administration

GET https://contoso-admin.sharepoint.com/_api/SPO.Tenant/sites

Use: SharePoint API, Application permission, Sites.FullControl.All

Sites.Selected is not an appropriate replacement for tenant-wide SharePoint administration because the selected grant is scoped to a site collection, while SPO.Tenant operates at the tenant administration level. Microsoft officially documents Sites.FullControl.All for SharePoint admin APIs called without a signed-in user.

B. Ordinary content retrieval

GET /_api/web/lists/GetById('{listId}')/items({itemId})

Use one of: Sites.Read.All or Sites.Selected + read grant on the target site if you do not want tenant-wide read access.

I hope this information helps.

Was this answer helpful?

1 person found this answer helpful.

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.