Microsoft Graph Open Extension allows to add untyped custom data to resources, like User and Messages, and there single API endpoint that gives you the possibility to extend Microsoft Graph with your own application data. You can add custom properties to Microsoft Graph resources without requiring an external data store.
Resource | Version |
---|---|
Administrative unit | Preview only |
Calendar event | GA |
Group calendar event | GA |
Group conversation thread post | GA |
device | GA |
group | GA |
message | GA |
organization | GA |
Personal contact | GA |
user | GA |
Here I will show you how to use open extension to add new custom data to User Resource.
I want to give the user the possibility to manage their owns application links, for that I create SPFx web part where the user can define the name, description, Url and Icon. This applications will be rendering as grid of tiles on SharePoint Site, Teams Tab or Teams Personal App.
The links are saved in User resource instance in Extensions property.
We can see how the extension was created in User resource instance executing the followed MSGraph Rest API.
https://graph.microsoft.com/v1.0/me?$select=id,displayName,mail,mobilePhone&$expand=extensions
In the response you can see in the Extensions property the data that was saved.
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users(id,displayName,mail,mobilePhone,extensions())/$entity",
"id": "33be46e1-8651-4ba3-8b43-2acbf95e71e8",
"displayName": "João José Mendes",
"mail": "joao.mendes@devjjm.onmicrosoft.com",
"mobilePhone": null,
"extensions@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('33be46e1-8651-4ba3-8b43-2acbf95e71e8')/extensions",
"extensions": [
{
"@odata.type": "#microsoft.graph.openTypeExtension",
"Apps": [
{
"name": "My SAP",
"description": "SAP Access",
"Url": "https://www.sap.pt",
"iconName": "AppIconDefault",
"tableData": {
"id": 0
}
},
{
"name": "Q&A",
"description": "Quick Access",
"Url": "https://www.qa.pt",
"iconName": "SurveyQuestions",
"tableData": {
"id": 1
}
},
{
"name": "My Reports",
"description": "FI Reports 2",
"Url": "https://www.sap.pt",
"iconName": "CRMReport",
"tableData": {
"id": 2
}
},
{
"name": "My CRM",
"description": "CRM - Support",
"Url": "https://www.crm.pt",
"iconName": "AnalyticsView",
"tableData": {
"id": 3
}
},
{
"name": "Travels",
"description": "Travel Agencies",
"Url": "https://www.tap.pt",
"iconName": "AirplaneSolid",
"tableData": {
"id": 4
}
},
{
"name": "My Redmind",
"description": "Redmind",
"Url": "https://www.red.pt",
"iconName": "Help",
"tableData": {
"id": 5
}
},
{
"name": "Office 365",
"description": "My Office 365",
"Url": "https://office.com",
"iconName": "OfficeLogo",
"tableData": {
"id": 6
}
},
{
"name": "TN3270",
"description": "Mainframe Access",
"Url": "https://tn3270web/",
"iconName": "Database",
"tableData": {
"id": 7
}
},
{
"name": "My App",
"description": "Access to My App",
"Url": "https://www.google.pt",
"iconName": "PowerApps2Logo",
"tableData": {
"id": 8
}
}
],
"id": "MyApps"
}
]
}
The Extensions property is an array with all of Extensions created for the resource and is derived from the extension abstract type. Each extension has an extensionName (id in the response) property which is the only pre-defined, writable property for all extensions, along with your custom data.
My Personal Applications will create an extension called “MyApps” for the User and has an attribute called “Applications”, which is a set of objects with information about the applications defined by the user..
The Extension is automatically created if not exists when the User save their list of Applications .
We can create extensions when creating a new resource or for existing resources, we just have to include the value of the Extensions property in the body of the request.
In this case the Extension is created by the Application for the current user. we can access to extension of a resource using the
Sample of the request with body that is called.
POST https://graph.microsoft.com/v1.0/me/extensions
{
"@odata.type" : "microsoft.graph.openTypeExtension",
"extensionName" : "MyApps",
"Apps": [
{
"name": "My SAP",
"description": "SAP Access",
"Url": "https://www.sap.pt",
"iconName": "AppIconDefault",
"tableData": {
"id": 0
}
},
{
"name": "Q&A",
"description": "Quick Access",
"Url": "https://www.qa.pt",
"iconName": "SurveyQuestions",
"tableData": {
"id": 1
}
},
{
"name": "My Reports",
"description": "FI Reports 2",
"Url": "https://www.sap.pt",
"iconName": "CRMReport",
"tableData": {
"id": 2
}
},
{
"name": "My CRM",
"description": "CRM - Support",
"Url": "https://www.crm.pt",
"iconName": "AnalyticsView",
"tableData": {
"id": 3
}
},
{
"name": "Travels",
"description": "Travel Agencies",
"Url": "https://www.tap.pt",
"iconName": "AirplaneSolid",
"tableData": {
"id": 4
}
},
{
"name": "My Redmind",
"description": "Redmind",
"Url": "https://www.red.pt",
"iconName": "Help",
"tableData": {
"id": 5
}
},
{
"name": "Office 365",
"description": "My Office 365",
"Url": "https://office.com",
"iconName": "OfficeLogo",
"tableData": {
"id": 6
}
},
{
"name": "TN3270",
"description": "Mainframe Access",
"Url": "https://tn3270web/",
"iconName": "Database",
"tableData": {
"id": 7
}
},
{
"name": "My App",
"description": "Access to My App",
"Url": "https://www.google.pt",
"iconName": "PowerApps2Logo",
"tableData": {
"id": 8
}
}
]
}
To update an extension, we need to PATCH the extension created on the specified instance of a resource and on the property we want to update.
Sample of update a list of Applications of User.
PATCH https://graph.microsoft.com/v1.0/me/extensions/myapps
{
"Apps": [
{
"name": "My SAP",
"description": "SAP Access",
"Url": "https://www.sap.pt",
"iconName": "AppIconDefault",
"tableData": {
"id": 0
}
},
{
"name": "Q&A",
"description": "Quick Access",
"Url": "https://www.qa.pt",
"iconName": "SurveyQuestions",
"tableData": {
"id": 1
}
},
{
"name": "My Reports",
"description": "FI Reports 2",
"Url": "https://www.sap.pt",
"iconName": "CRMReport",
"tableData": {
"id": 2
}
},
{
"name": "My CRM",
"description": "CRM - Support",
"Url": "https://www.crm.pt",
"iconName": "AnalyticsView",
"tableData": {
"id": 3
}
},
{
"name": "Travels",
"description": "Travel Agencies",
"Url": "https://www.tap.pt",
"iconName": "AirplaneSolid",
"tableData": {
"id": 4
}
},
{
"name": "My Redmind",
"description": "Redmind",
"Url": "https://www.red.pt",
"iconName": "Help",
"tableData": {
"id": 5
}
},
{
"name": "Office 365",
"description": "My Office 365",
"Url": "https://office.com",
"iconName": "OfficeLogo",
"tableData": {
"id": 6
}
},
{
"name": "TN3270",
"description": "Mainframe Access",
"Url": "https://tn3270web/",
"iconName": "Database",
"tableData": {
"id": 7
}
},
{
"name": "My App 2",
"description": "Access to My App",
"Url": "https://www.google.pt",
"iconName": "PowerApps2Logo",
"tableData": {
"id": 8
}
}
]
}
To delete an extension, we need to do an DELETE on the extension created on the specified instance of a resource. This will delete the extension and its properties..
Sample:
DELETE https://graph.microsoft.com/v1.0/me/extensions/myapps
The following limits apply to directory resources (such as user, group, device):
The following limits apply to Outlook resources (such as message, event, and contact):
Add custom data to resources using extensions
SPFx – My Personal Apps – Web Part
Thank you for reading!