Créer un abonnement

Espace de noms: microsoft.graph

Importante

Les API sous la version /beta dans Microsoft Graph sont susceptibles d’être modifiées. L’utilisation de ces API dans des applications de production n’est pas prise en charge. Pour déterminer si une API est disponible dans v1.0, utilisez le sélecteur Version .

S’abonne à une application d’écouteur afin de recevoir des notifications de modification lorsque le type demandé de modifications se produit au niveau de la ressource spécifiée dans Microsoft Graph.

Pour identifier les ressources pour lesquelles vous pouvez créer des abonnements et les limitations des abonnements, consultez Configurer des notifications pour les modifications apportées aux données de ressource : Ressources prises en charge.

Certaines ressources prennent en charge les notifications enrichies, c’est-à-dire les notifications qui incluent des données de ressources. Pour plus d’informations sur ces ressources, consultez Configurer des notifications de modification qui incluent des données de ressource : Ressources prises en charge.

Cette API est disponible dans les déploiements cloud nationaux suivants.

Service global Gouvernement américain L4 Gouvernement américain L5 (DOD) Chine exploitée par 21Vianet

Autorisations

La création d’un abonnement nécessite une autorisation de lecture sur la ressource. Par exemple, pour obtenir des notifications de modification sur les messages, votre application doit disposer des autorisations Mail.Read.

En fonction du type de ressource et d’autorisation(délégué ou application) demandé, l’autorisation spécifiée dans le tableau suivant est la moins requise privilégiée pour appeler cette API. Pour en savoir plus, notamment sur les mesures de prudence avant de choisir des autorisations, recherchez les autorisations dans Autorisations.

Remarque

  • En raison de restrictions de sécurité, les abonnements Microsoft Graph ne prennent pas en charge les autorisations d’accès en écriture lorsque seules les autorisations d’accès en lecture sont nécessaires.
  • Certaines ressources prennent en charge les notifications de modification dans plusieurs scénarios, chacun pouvant nécessiter des autorisations différentes. Dans ce cas, utilisez le chemin de ressource pour différencier les scénarios.
Ressource prise en charge Déléguée (compte professionnel ou scolaire) Déléguée (compte Microsoft personnel) Application
aiInsights
/copilot/users/{userId}/onlineMeetings/getAllAiInsights
Informations sur l’IA Copilot des réunions auxquelles un utilisateur particulier participe.
OnlineMeetingAiInsight.Read.All Non prise en charge. OnlineMeetingAiInsight.Read.All
aiInsights
/copilot/users/{userId}/onlineMeetings/{onlineMeetingId}/aiInsights
Informations sur l’IA Copilot pour une réunion particulière.
OnlineMeetingAiInsight.Read.All Non prise en charge. OnlineMeetingAiInsight.Read.All
aiInteraction
copilot/users/{userId}/interactionHistory/getAllEnterpriseInteractions
Interactions Copilot AI dont un utilisateur particulier fait partie.
AiEnterpriseInteraction.Read Non prise en charge. AiEnterpriseInteraction.Read.All, AiEnterpriseInteraction.Read.User
aiInteraction
copilot/interactionHistory/getAllEnterpriseInteractions
Interactions avec l’IA Copilot dans une organisation.
Non prise en charge. Non prise en charge. AiEnterpriseInteraction.Read.All
approvalItems Non prise en charge. Non prise en charge. ApprovalSolution.ReadWrite.All
callRecord Non prise en charge. Non prise en charge. CallRecords.Read.All
callRecording
communications/onlineMeetings/getAllRecordings
Tout enregistrement devient disponible dans le locataire.
Non prise en charge. Non prise en charge. OnlineMeetingRecording.Read.All
callRecording
communications/onlineMeetings/{onlineMeetingId}/recordings
Tout enregistrement devient disponible pour une réunion spécifique.
OnlineMeetingRecording.Read.All Non prise en charge. OnlineMeetingRecording.Read.All
callRecording
users/{userId}/onlineMeetings/getAllRecordings
Un enregistrement d’appel qui devient disponible dans une réunion organisée par un utilisateur spécifique.
OnlineMeetingRecording.Read.All Non prise en charge. OnlineMeetingRecording.Read.All
callRecording
appCatalogs/teamsApps/{id}/installedToOnlineMeetings/getAllRecordings
Un enregistrement d’appel qui devient disponible dans une réunion où une application Teams particulière est installée.
Non prise en charge. Non prise en charge. OnlineMeetingRecording.Read.All, OnlineMeetingRecording.Read. Chat
transcription de callTranscript
communications/onlineMeetings/getAllTranscripts
Toute transcription devient disponible dans le locataire.
Non prise en charge. Non prise en charge. OnlineMeetingTranscript.Read.All
transcription de callTranscript
communications/onlineMeetings/{onlineMeetingId}/transcripts
Toute transcription devient disponible pour une réunion spécifique.
OnlineMeetingTranscript.Read.All Non prise en charge. OnlineMeetingTranscript.Read.All
transcription de callTranscript
users/{userId}/onlineMeetings/getAllTranscripts
Une transcription d’appel qui devient disponible dans une réunion organisée par un utilisateur spécifique.
OnlineMeetingTranscript.Read.All Non prise en charge. OnlineMeetingTranscript.Read.All
transcription de callTranscript
appCatalogs/teamsApps/{id}/installedToOnlineMeetings/getAllTranscripts
Une transcription d’appel qui devient disponible dans une réunion où une application Teams particulière est installée.
Non prise en charge. Non prise en charge. OnlineMeetingTranscript.Read.All, OnlineMeetingTranscript.Read. Chat
channel
/teams/getAllChannels
Tous les canaux d’une organisation.
Non prise en charge. Non prise en charge. Channel.ReadBasic.All, ChannelSettings.Read.All, ChannelSettings.ReadWrite.All
channel
/teams/{id}/channels
Tous les canaux d’une équipe particulière d’une organisation.
Channel.ReadBasic.All, ChannelSettings.Read.All, ChannelSettings.ReadWrite.All Non prise en charge. Channel.ReadBasic.All, ChannelSettings.Read.All, ChannelSettings.ReadWrite.All
conversation
/chats
Toutes les conversations d’une organisation.
Non prise en charge. Non prise en charge. Chat.ReadBasic.All, Chat.Read.All, Chat.ReadWrite.All
conversation
/chats/{id}
Une conversation particulière.
Chat.ReadBasic, Chat.Read, Chat.ReadWrite Non prise en charge. ChatSettings.Read. Chat, ChatSettings.ReadWrite. Chat, Chat. Gérer. Chat, Chat. ReadBasic.All, Chat. Read.All, Chat. ReadWrite.All
conversation
/appCatalogs/teamsApps/{id}/installedToChats
Toutes les conversations d’une organisation dans laquelle une application Teams particulière est installée.
Non prise en charge. Non prise en charge. Chat. ReadBasic.WhereInstalled, Chat. Read.WhereInstalled, Chat. ReadWrite.WhereInstalled
conversation
/users/{id}/chats
Toutes les conversations dont un utilisateur particulier fait partie.
Chat.ReadBasic, Chat.Read, Chat.ReadWrite Non prise en charge. Chat.ReadBasic.All, Chat.Read.All, Chat.ReadWrite.All
chatMessage
/teams/{id}/channels/{id}/messages
Tous les messages et réponses d’un canal particulier.
ChannelMessage.Read.All, Group.Read.All, Group.ReadWrite.All Non prise en charge. ChannelMessage.Read.Group, ChannelMessage.Read.All
chatMessage
/teams/getAllMessages
Tous les messages de canal de l’organisation.
Non prise en charge. Non prise en charge. ChannelMessage.Read.All
chatMessage
/chats/{id}/messages
Tous les messages d’une conversation.
Chat.Read, Chat.ReadWrite Non prise en charge. Chat.Read.All
chatMessage
/chats/getAllMessages
Tous les messages de conversation d’une organisation.
Non prise en charge. Non prise en charge. Chat.Read.All
chatMessage
/users/{id}/chats/getAllMessages
Messages de chat pour toutes les conversations dont un utilisateur particulier fait partie.
Chat.Read, Chat.ReadWrite Non prise en charge. Chat.Read.All, Chat.ReadWrite.All
chatMessage
/appCatalogs/teamsApps/{id}/installedToChats/getAllMessages
Messages de chat pour toutes les conversations d’une organisation dans laquelle une application Teams particulière est installée.
Non prise en charge. Non prise en charge. Chat. Read.WhereInstalled, Chat. ReadWrite.WhereInstalled
contact Contacts.Read Contacts.Read Contacts.Read
conversationMember
/chats/getAllMembers
Membres de toutes les conversations d’une organisation.
Non prise en charge. Non prise en charge. ChatMember.Read.All, ChatMember.ReadWrite.All, Chat.ReadBasic.All, Chat.Read.All, Chat.ReadWrite.All
conversationMember
/chats/{id}/members
Membres d’une conversation particulière.
ChatMember.Read, ChatMember.ReadWrite, Chat.ReadBasic, Chat.Read, Chat.ReadWrite Non prise en charge. ChatMember.Read.Chat, Chat.Manage.Chat, ChatMember.Read.All, ChatMember.ReadWrite.All, Chat.ReadBasic.All, Chat.Read.All, Chat.ReadWrite.All
conversationMember
/appCatalogs/teamsApps/{id}/installedToChats/getAllMembers
Chat membres pour toutes les conversations d’un organization où une application Teams particulière est installée.
Non prise en charge. Non prise en charge. ChatMember.Read.WhereInstalled, ChatMember.ReadWrite.WhereInstalled, Chat. ReadBasic.WhereInstalled, Chat. Read.WhereInstalled, Chat. ReadWrite.WhereInstalled
conversationMember
/teams/getAllMembers
Membres de toutes les équipes d’une organisation.
Non prise en charge. Non prise en charge. TeamMember.Read.All, TeamMember.ReadWrite.All
conversationMember
/teams/{id}/members
Membres d’une équipe particulière.
TeamMember.Read.All Non prise en charge. TeamMember.Read.All
conversationMember
/teams/{id}/channels/getAllMembers
Membres dans tous les canaux privés d’une équipe particulière.
Non prise en charge. Non prise en charge. ChannelMember.Read.All
conversationMember
/teams/getAllChannels/getAllMembers
Non prise en charge. Non prise en charge. ChannelMember.Read.All
driveItem(OneDrive personnel de l’utilisateur) Non prise en charge. Files.ReadWrite Non prise en charge.
driveItem (OneDrive professionnel ou scolaire) Files.ReadWrite.All Non prise en charge. Files.ReadWrite.All
event Calendars.Read Calendars.Read Calendars.Read
groupe Group.Read.All Non prise en charge. Group.Read.All
Conversation de groupe Group.Read.All Non prise en charge. Non prise en charge.
Alerte de surveillance de l’intégrité de Microsoft Entra
/reports/healthmonitoring/alerts
HealthMonitoringAlertConfig.ReadWrite.All Non prise en charge. HealthMonitoringAlertConfig.ReadWrite.All
liste Sites.ReadWrite.All Non prise en charge. Sites.ReadWrite.All
message Mail.ReadBasic, Mail.Read Mail.ReadBasic, Mail.Read Mail.Read
offerShiftRequest
/teams/{id}/schedule/offerShiftRequests
Modifications apportées à toute demande de shift d’offre dans une équipe.
Schedule.Read.All, Schedule.ReadWrite.All Non prise en charge. Schedule.Read.All, Schedule.ReadWrite.All
onlineMeeting Non prise en charge. Non prise en charge. OnlineMeetings.Read.All, OnlineMeetings.ReadWrite.All
openShiftChangeRequest
/teams/{id}/schedule/openShiftChangeRequests
Modifications apportées à toute demande de shift ouvert dans une équipe.
Schedule.Read.All, Schedule.ReadWrite.All Non prise en charge. Schedule.Read.All, Schedule.ReadWrite.All
présence Presence.Read.All Non prise en charge. Non prise en charge.
imprimante Non prise en charge. Non prise en charge. Printer.Read.All, Printer.ReadWrite.All
printTaskDefinition Non prise en charge. Non prise en charge. PrintTaskDefinition.ReadWrite.All
alerte de sécurité SecurityEvents.ReadWrite.All Non prise en charge. SecurityEvents.ReadWrite.All
shift
/teams/{id}/schedule/shifts
Modifications apportées à n’importe quel quart de travail dans une équipe.
Schedule.Read.All, Schedule.ReadWrite.All Non prise en charge. Schedule.Read.All, Schedule.ReadWrite.All
swapShiftsChangeRequest
/teams/{id}/schedule/swapShiftsChangeRequests
Modifications apportées à une demande d’échange de shift dans une équipe.
Schedule.Read.All, Schedule.ReadWrite.All Non prise en charge. Schedule.Read.All, Schedule.ReadWrite.All
team
/teams
Toutes les équipes d’une organisation.
Non prise en charge. Non prise en charge. Team.ReadBasic.All, TeamSettings.Read.All
team
/teams/{id}
Une équipe particulière.
Team.ReadBasic.All, TeamSettings.Read.All Non prise en charge. Team.ReadBasic.All, TeamSettings.Read.All
timeOffRequest
/teams/{id}/schedule/timeOffRequests
Modifications apportées à toute demande de congé dans une équipe.
Schedule.Read.All, Schedule.ReadWrite.All Non prise en charge. Schedule.Read.All, Schedule.ReadWrite.All
todoTask Tasks.ReadWrite Tasks.ReadWrite Tasks.ReadWrite.All
utilisateur User.Read.All User.Read.All User.Read.All
virtualEventWebinar VirtualEvent.Read Non prise en charge. VirtualEvent.Read.All
virtualEventTownhall VirtualEvent.Read Non prise en charge. VirtualEvent.Read.All
baseTask (déconseillé) Tasks.ReadWrite Tasks.ReadWrite Non prise en charge.

Remarque

Les autorisations suivantes utilisent un consentement spécifique à la ressource :

  • OnlineMeetingRecording.Read. Chat
  • OnlineMeetingTranscript.Read. Chat
  • ChatSettings.Read.Chat
  • ChatSettings.ReadWrite.Chat
  • Chat.Manage.Chat
  • ChannelMessage.Read.Group
  • ChatMember.Read.Chat
  • AiEnterpriseInteraction.Read.User

chatMessage

chatMessage peuvent être spécifiés pour inclure les données de ressource (includeResourceData défini sur true). Dans ce cas, le chiffrement est requis et la création de l’abonnement échoue si un encryptionCertificate n’est pas spécifié pour ces abonnements.

Utilisez l’en-tête de Prefer: include-unknown-enum-members requête pour obtenir les valeurs suivantes dans chatMessagemessageTypeénumération évolutive : systemEventMessage pour /teams/{id}/channels/{id}/messages et /chats/{id}/messages ressource.

conversationMember

Les abonnements conversationMember peuvent être spécifiés pour inclure les données de ressources (includeResourceData défini sur true). Dans ce cas, le chiffrement est requis et la création de l’abonnement échoue si un encryptionCertificate n’est pas spécifié pour ces abonnements.

Équipe, canal et conversation

Les abonnements d’équipe, de canal et de conversation peuvent être spécifiés pour inclure les données de ressources (includeResourceData défini sur true). Dans ce cas, le chiffrement est requis et la création de l’abonnement échoue si un encryptionCertificate n’est pas spécifié pour ces abonnements.

Vous pouvez utiliser le paramètre de chaîne de requête notifyOnUserSpecificProperties lorsque vous vous abonnez aux modifications apportées à une conversation particulière ou au niveau de l’utilisateur. Lorsque vous définissez le paramètre de chaîne de requête notifyOnUserSpecificProperties sur true lors de la création de l’abonnement, deux types de charges utiles sont envoyés à l’abonné. L’un contient des propriétés spécifiques à l’utilisateur, tandis que l’autre est envoyé sans celles-ci. Pour plus d’informations, consultez Obtenir des notifications de modification pour les conversations à l’aide de Microsoft Graph.

aiInsights

Les abonnements à Copilot AI Insights nécessitent une licence Copilot valide qui inclut le plan de service Copilot suivant :

  • Microsoft 365 Copilot Chat : 3f30311c-6b1e-48a4-ab79-725b469da960

aiInteraction

Les abonnements aux interactions Copilot AI nécessitent une licence Copilot valide qui inclut le plan de service Copilot suivant :

  • Microsoft 365 Copilot Chat : 3f30311c-6b1e-48a4-ab79-725b469da960

Pour les abonnements qui ciblent les interactions Copilot AI dont un utilisateur particulier fait partie, l’utilisateur dans le chemin de ressource doit avoir les plans de service précédents qui lui sont attribués dans un état valide.

Pour les abonnements qui ciblent les interactions Copilot AI pour l’ensemble du client, le locataire doit disposer de licences valides approvisionnées qui incluent tous les plans de service Copilot précédents.

driveItem

D’autres limitations s’appliquent aux abonnements sur des éléments OneDrive. Les limitations s’appliquent à la création, ainsi que de la gestion des abonnements (prise, la mise à jour et suppression d’abonnements).

Sur un OneDrive personnel, vous pouvez vous abonner au dossier racine ou à tout sous-dossier de ce lecteur. Sur OneDrive professionnel ou scolaire, vous pouvez vous abonner uniquement au dossier racine. Des notifications de modification sont envoyées pour les modifications demandées sur le dossier abonné ou sur tout fichier, dossier ou autre instance de driveItem dans sa hiérarchie. Vous ne pouvez pas vous abonner à des instances de lecteur ou de driveItem qui ne sont pas des dossiers, comme des fichiers individuels.

OneDrive professionnel ou scolaire et support SharePoint envoyant à votre application des notifications d’événements de sécurité qui se produisent sur un driveItem. Pour vous abonner à ces événements, ajoutez l’en-tête prefer:includesecuritywebhooks à votre demande de création d’abonnement. Une fois l’abonnement créé, vous recevez des notifications lorsque les autorisations sur un élément changent. Cet en-tête s’applique à SharePoint et OneDrive professionnel ou scolaire, mais pas aux comptes OneDrive de consommateur.

contact, événement et message

Vous pouvez vous abonner aux modifications apportées aux ressources de contact, d’événement ou de message Outlook et éventuellement spécifier dans la charge utile de la requête POST s’il faut inclure des données de ressource chiffrées dans les notifications.

La création et la gestion (obtention, mise à jour et suppression) d’un abonnement nécessitent une étendue de lecture de la ressource. Par exemple, pour recevoir des notifications de modification sur les messages, votre application a besoin de l’autorisation Mail Read. Les notifications de modification Outlook prennent en charge les étendues d’autorisation déléguées et d’application. Notez les limitations suivantes :

  • L’autorisation déléguée permet de s'abonner à des articles dans des dossiers qui se trouvent uniquement dans la boîte aux lettres de l'utilisateur connecté. Par exemple, vous ne pouvez pas utiliser l’autorisation déléguée Calendars.Read pour vous abonner à des événements dans la boîte aux lettres d’un autre utilisateur.

  • Pour vous abonner afin de modifier les notifications de contacts, d’événements ou de messages dans Outlook dans dossierspartagés ou délégués:

    • Permet de s’abonner aux modifications d’éléments dans un dossier ou une boîte aux lettres de l’autorisation d’application correspondante n’importe quel utilisateur dans le client.
    • N’utilisez pas les autorisations de partage d’Outlook (Contacts.Read.Shared, Calendars.Read.Shared, Mail.Read.Shared et leurs équivalents en lecture/écriture), car elles ne prennent pas en charge l’abonnement aux notifications de modification des éléments dans les dossiers partagés ou délégués.

onlineMeetings, présence

Les abonnements sur onlineMeetings et la présence nécessitent les propriétés encryptionCertificate et encryptionCertificateId lors de la création d’un abonnement pour les notifications avec des données de ressource chiffrées. Pour plus d’informations, consultez Configuration des notifications de modification pour inclure les données de ressource. Pour plus d’informations sur les abonnements à des réunions en ligne, consultez Obtenir des notifications de modification pour les réunions en ligne.

virtualEventWebinar et virtualEventTownhall

Les abonnements aux événements virtuels ne prennent en charge que les notifications de base et sont limités à quelques entités d’un événement virtuel. Pour plus d’informations sur les types d’abonnement pris en charge, consultez Obtenir des notifications de modification pour les mises à jour d’événements virtuels Microsoft Teams.

Requête HTTP

POST /subscriptions

En-têtes de demande

Nom Type Description
Autorisation string Porteur {token}. Obligatoire. En savoir plus sur l’authentification et les autorisations.

Corps de la demande

Dans le corps de la demande, fournissons une représentation JSON de l’objet d’abonnement.

Réponse

En cas de réussite, cette méthode renvoie un code de réponse et un 201 Created objet Subscription dans le corps de la réponse.

Pour plus d’informations sur le retour des erreurs, voir Réponses aux erreurs.

Exemple

Demande

Dans le corps de la demande, fournissez une représentation JSON de l’objet abonnement. Les champs clientState et latestSupportedTlsVersion sont facultatifs.

Cette demande crée un abonnement pour les notifications de modification relatives aux nouveaux messages reçus par l’utilisateur actuellement connecté.

POST https://graph.microsoft.com/beta/subscriptions
Content-type: application/json

{
   "changeType": "created",
   "notificationUrl": "https://webhook.azurewebsites.net/api/send/myNotifyClient",
   "resource": "me/mailFolders('Inbox')/messages",
   "expirationDateTime":"2016-11-20T18:23:45.9356913Z",
   "clientState": "secretClientValue",
   "latestSupportedTlsVersion": "v1_2"
}

Dans le corps de la demande, fournissez une représentation JSON de l’objet abonnement. Les champs clientState et latestSupportedTlsVersion sont facultatifs.

Comportement de l’abonnement en double

Les abonnements en double ne sont pas autorisés. Lorsqu’une demande d’abonnement contient les mêmes valeurs pour changeType et Resource qu’un abonnement existant, la demande échoue avec un code 409 Conflictd’erreur HTTP et le message Subscription Id <> already exists for the requested combinationd’erreur .

Exemples de ressources

Les valeurs suivantes sont valides pour la propriété de ressource.

Type de ressource Exemples
approvalItems solution/approval/approvalItems
callRecord communications/callRecords
callRecording communications/onlineMeetings/getAllRecordings, communications/onlineMeetings/{onlineMeetingId}/recordings, users/{userId}/onlineMeetings/getAllRecordings, appCatalogs/teamsApps/{id}/installedToOnlineMeetings/getAllRecordings
transcription de callTranscript communications/onlineMeetings/getAllTranscripts, communications/onlineMeetings/{onlineMeetingId}/transcripts, users/{userId}/onlineMeetings/getAllTranscripts, appCatalogs/teamsApps/{id}/installedToOnlineMeetings/getAllTranscripts
channel /teams/getAllChannels, /teams/{id}/channels
conversation /chats, /chats/{id}
chatMessage chats/{id}/messages, chats/getAllMessages, teams/{id}/channels/{id}/messages, teams/getAllMessages
contact me/contacts
conversationMember /chats/{id}/members, /chats/getAllMembers, /teams/{id}/members, /teams/getAllMembers, /teams/{id}/channels/getAllMembers
driveItem me/drive/root
event me/events
groupe groups
Conversation de groupe groups('{id}')/conversations
Alerte de surveillance de l’intégrité reports/healthmonitoring/alerts
list sites/{site-id}/lists/{list-id}
message me/mailfolders('inbox')/messages, me/messages
onlineMeeting /communications/onlineMeetings/?$filter=JoinWebUrl eq '{JoinWebUrl}'
présence /communications/presences/{id} (utilisateur unique), /communications/presences?$filter=id in ('{id}','{id}',…) (plusieurs utilisateurs)
imprimante print/printers/{id}/jobs
printTaskDefinition print/taskDefinitions/{id}/tasks
équipe /teams, /teams/{id}
utilisateur users
todoTask /me/todo/lists/{todoTaskListId}/tasks
alerte de sécurité security/alerts?$filter=status eq 'NewAlert'
baseTask (déconseillé) /me/tasks/lists/{Id}/tasks

Remarque

Tout chemin d’accès commençant par me peut également être utilisé avec users/{id} plutôt que me pour cibler un utilisateur spécifique au lieu de l’utilisateur actuel.

Réponse

L’exemple suivant illustre la réponse.

Remarque : l’objet de réponse affiché ci-après peut être raccourci pour plus de lisibilité.

HTTP/1.1 201 Created
Content-type: application/json

{
  "@odata.context": "https://graph.microsoft.com/beta/$metadata#subscriptions/$entity",
  "id": "7f105c7d-2dc5-4530-97cd-4e7ae6534c07",
  "resource": "me/mailFolders('Inbox')/messages",
  "applicationId": "24d3b144-21ae-4080-943f-7067b395b913",
  "changeType": "created",
  "clientState": "secretClientValue",
  "notificationUrl": "https://webhook.azurewebsites.net/api/send/myNotifyClient",
  "expirationDateTime": "2016-11-20T18:23:45.9356913Z",
  "creatorId": "8ee44408-0679-472c-bc2a-692812af3437",
  "latestSupportedTlsVersion": "v1_2",
  "notificationContentType": "application/json"
}

Exemple 2 : créer un abonnement ciblant un point de terminaison web Push

L’exemple suivant crée un abonnement qui fournit des notifications de modification chiffrées à un point de terminaison Web Push natif du navigateur (tel que web.push.apple.com, fcm.googleapis.comou updates.push.services.mozilla.com).

Avant de créer cet abonnement, l’application basée sur un navigateur doit :

  1. Appelez la fonction getVapidPublicKey sur la collection d’abonnement pour obtenir la clé publique VAPID de Microsoft Graph (RFC 8292).
  2. Appelez PushManager.subscribe({ applicationServerKey: <vapidPublicKey> }) pour vous inscrire au service push du navigateur. Le navigateur renvoie des PushSubscription valeurs , p256dh, et auth qui contiennentendpoint.

L’application crée ensuite l’abonnement avec notificationUrl définie sur l’URL de point de terminaison du service push nu et les propriétés vapidPublicKey, webPushEncryptionP256dhPublicKey et webPushEncryptionSecret définies sur les valeurs renvoyées par le navigateur. Après la création, Microsoft Graph chiffre chaque notification selon RFC 8291 à l’aide des clés stockées et signe la demande avec VAPID avant de la publier dans le service push.

Demande

POST https://graph.microsoft.com/beta/subscriptions
Content-type: application/json

{
  "changeType": "created,updated",
  "notificationUrl": "https://web.push.apple.com/QKmFUwSBFK8g7iY4t1...",
  "resource": "me/mailFolders('Inbox')/messages",
  "expirationDateTime": "2026-12-31T11:00:00.0000000Z",
  "clientState": "secretClientValue",
  "vapidPublicKey": "BNKm...base64url-encoded-server-vapid-public-key...",
  "webPushEncryptionP256dhPublicKey": "BNcR...base64url-encoded-client-public-key...",
  "webPushEncryptionSecret": "tBHI...base64url-encoded-auth-secret..."
}

Remarque : La propriété webPushEncryptionSecret est en écriture seule. Il n’est jamais renvoyé dans GET les réponses (renvoyé en tant que null). Traitez la valeur comme un secret.

Validation du point de terminaison de notification

Le point de terminaison de notification d’abonnement (spécifié dans la propriété notificationUrl ) doit être capable de répondre à une demande de validation, comme décrit dans Configurer des notifications pour les modifications apportées aux données utilisateur. Si la validation échoue, la demande pour créer l’abonnement renvoie une erreur 400 de Requête incorrecte.