Microsoft Graph does not have a native endpoint for pinning emails. Instead, official Outlook clients track the pinned state under the hood using a low-level MAPI property called PidTagRenewTime.
SystemTime 0x0F024500-01-01T00:00:00Z.receivedDateTime.GET)To read the pinned status, you must explicitly expand the target MAPI property using an OData filter.
GET https://microsoft.com
?$expand=singleValueExtendedProperties($filter=id eq 'SystemTime 0x0F02')
&$top=20
Iterate through the returned singleValueExtendedProperties array for each message:
const isPinned = message.singleValueExtendedProperties?.some(
prop => prop.id === "SystemTime 0x0F02" && prop.value.startsWith("4500")
);
if (isPinned) {
// 1. Render pin icon in UI
// 2. Anchor/Sort to the top of the folder list
}
PATCH)To pin a message so it syncs natively back to official Outlook clients, update its MAPI property to the year 4500.
PATCH https://microsoft.com{message-id}
Content-Type: application/json
{
"singleValueExtendedProperties": [
{
"id": "SystemTime 0x0F02",
"value": "4500-01-01T00:00:00Z"
}
]
}
PATCH)To unpin a message, update its value back to the email's original receivedDateTime.
PATCH https://microsoft.com{message-id}
Content-Type: application/json
{
"singleValueExtendedProperties": [
{
"id": "SystemTime 0x0F02",
"value": "2026-09-22T14:44:00Z"
}
]
}
singleValueExtendedProperties collections properly during PATCH requests. If updates silently fail, bypass the SDK models and drop down to a raw HTTP request.SystemTime 0x0F02). Ensure parsing matches exact casings.
comments (0)