Crear suscripción

Espacio de nombres: microsoft.graph

Importante

Las API de la versión /beta de Microsoft Graph están sujetas a cambios. No se admite el uso de estas API en aplicaciones de producción. Para determinar si una API está disponible en la versión 1.0, use el selector de Versión.

Suscribe una aplicación de escucha para que reciba notificaciones de cambio cuando se realiza el tipo de cambios solicitado en el recurso especificado de Microsoft Graph.

Para identificar los recursos para los que puede crear suscripciones y las limitaciones de las suscripciones, consulte Configurar notificaciones para cambios en los datos de recursos: Recursos admitidos.

Algunos recursos admiten notificaciones enriquecidas, es decir, notificaciones que incluyen datos de recursos. Para obtener más información sobre estos recursos, consulte Configuración de notificaciones de cambios que incluyan datos de recursos: Recursos compatibles.

Esta API está disponible en las siguientes implementaciones en la nube nacional.

Servicio global Administración pública de EE. UU. Gobierno de EE. UU. L5 (DOD) China operado por 21Vianet

Permissions

La creación de una suscripción requiere permiso de lectura para el recurso. Por ejemplo, para obtener notificaciones de cambios en los mensajes, la aplicación necesita los permisos Mail.Read.

Según el recurso y el tipo de permisos (delegado o de aplicación) solicitado, el permiso especificado en la tabla siguiente es el menos privilegiado necesario para llamar a esta API. Para obtener más información, incluidas las precauciones antes de elegir los permisos, busque los siguientes permisos en Permisos.

Nota:

  • Debido a restricciones de seguridad, las suscripciones de Microsoft Graph no admiten permisos de acceso de escritura cuando solo se necesitan permisos de acceso de lectura.
  • Algunos recursos admiten notificaciones de cambios en varios escenarios, cada uno de los cuales puede requerir permisos diferentes. En esos casos, use la ruta de acceso del recurso para diferenciar los escenarios.
Recurso admitido Delegado (cuenta profesional o educativa) Delegado (cuenta de Microsoft personal) Aplicación
aiInsights
/copilot/users/{userId}/onlineMeetings/getAllAiInsights
Información de la IA de Copilot de las reuniones de las que forma parte un usuario concreto.
OnlineMeetingAiInsight.Read.All No admitida. OnlineMeetingAiInsight.Read.All
aiInsights
/copilot/users/{userId}/onlineMeetings/{onlineMeetingId}/aiInsights
Información de IA de Copilot para una reunión concreta.
OnlineMeetingAiInsight.Read.All No admitida. OnlineMeetingAiInsight.Read.All
aiInteracción
copilot/users/{userId}/interactionHistory/getAllEnterpriseInteractions
Interacciones de IA de Copilot de las que forma parte un usuario concreto.
AiEnterpriseInteraction.Read No admitida. AiEnterpriseInteraction.Read.All, AiEnterpriseInteraction.Read.User
aiInteracción
copilot/interactionHistory/getAllEnterpriseInteractions
Interacciones de IA de Copilot en una organización.
No admitida. No admitida. AiEnterpriseInteraction.Read.All
approvalItems No admitida. No admitida. ApprovalSolution.ReadWrite.All
callRecord No admitida. No admitida. CallRecords.Read.All
grabación de llamadas
communications/onlineMeetings/getAllRecordings
Cualquier grabación estará disponible en el espacio empresarial.
No admitida. No admitida. OnlineMeetingRecording.Read.All
grabación de llamadas
communications/onlineMeetings/{onlineMeetingId}/recordings
Cualquier grabación estará disponible para una reunión específica.
OnlineMeetingRecording.Read.All No admitida. OnlineMeetingRecording.Read.All
grabación de llamadas
users/{userId}/onlineMeetings/getAllRecordings
Una grabación de llamada que está disponible en una reunión organizada por un usuario específico.
OnlineMeetingRecording.Read.All No admitida. OnlineMeetingRecording.Read.All
grabación de llamadas
appCatalogs/teamsApps/{id}/installedToOnlineMeetings/getAllRecordings
Una grabación de llamada que está disponible en una reunión en la que está instalada una aplicación de Teams determinada.
No admitida. No admitida. OnlineMeetingRecording.Read.All, OnlineMeetingRecording.Read. Chat
Transcripción de llamadas
communications/onlineMeetings/getAllTranscripts
Cualquier transcripción estará disponible en el espacio empresarial.
No admitida. No admitida. OnlineMeetingTranscript.Read.All
Transcripción de llamadas
communications/onlineMeetings/{onlineMeetingId}/transcripts
Cualquier transcripción estará disponible para una reunión específica.
OnlineMeetingTranscript.Read.All No admitida. OnlineMeetingTranscript.Read.All
Transcripción de llamadas
users/{userId}/onlineMeetings/getAllTranscripts
Una transcripción de llamada que está disponible en una reunión organizada por un usuario específico.
OnlineMeetingTranscript.Read.All No admitida. OnlineMeetingTranscript.Read.All
Transcripción de llamadas
appCatalogs/teamsApps/{id}/installedToOnlineMeetings/getAllTranscripts
Una transcripción de llamada que está disponible en una reunión en la que está instalada una aplicación de Teams determinada.
No admitida. No admitida. OnlineMeetingTranscript.Read.All, OnlineMeetingTranscript.Read. Chat
channel
/teams/getAllChannels
Todos los canales de una organización.
No admitida. No admitida. Channel.ReadBasic.All, ChannelSettings.Read.All
channel
/teams/{id}/channels
Todos los canales de un equipo concreto de una organización.
Channel.ReadBasic.All, ChannelSettings.Read.All No admitida. Channel.ReadBasic.All, ChannelSettings.Read.All
chat
/chats
Todos los chats de una organización.
No admitida. No admitida. Chat.ReadBasic.All, Chat.Read.All, Chat.ReadWrite.All
chat
/chats/{id}
Un chat en particular.
Chat.ReadBasic, Chat.Read, Chat.ReadWrite No admitida. ChatSettings.Read. Chat, ChatSettings.ReadWrite. Chat, chat. Administrar. Chat, chat. ReadBasic.All, Chat. Read.All, Chat. ReadWrite.All
chat
/appCatalogs/teamsApps/{id}/installedToChats
Todos los chats de una organización donde está instalada una aplicación de Teams determinada.
No admitida. No admitida. Chat. ReadBasic.WhereInstalled, chat. Read.WhereInstalled, Chat. ReadWrite.WhereInstalled
chat
/users/{id}/chats
Todos los chats de los que forma parte un usuario concreto.
Chat.ReadBasic, Chat.Read, Chat.ReadWrite No admitida. Chat.ReadBasic.All, Chat.Read.All, Chat.ReadWrite.All
chatMessage
/teams/{id}/channels/{id}/messages
Todos los mensajes y respuestas de un canal determinado.
ChannelMessage.Read.All, Group.Read.All, Group.ReadWrite.All No admitida. ChannelMessage.Read.Group, ChannelMessage.Read.All
chatMessage
/teams/getAllMessages
Todos los mensajes de canal de la organización.
No admitida. No admitida. ChannelMessage.Read.All
chatMessage
/chats/{id}/messages
Todos los mensajes de un chat.
Chat.Read, Chat.ReadWrite No admitida. Chat.Read.All
chatMessage
/chats/getAllMessages
Todos los mensajes de chat de una organización.
No admitida. No admitida. Chat.Read.All
chatMessage
/users/{id}/chats/getAllMessages
Mensajes de chat para todos los chats de los que forma parte un usuario concreto.
Chat.Read, Chat.ReadWrite No admitida. Chat.Read.All, Chat.ReadWrite.All
chatMessage
/appCatalogs/teamsApps/{id}/installedToChats/getAllMessages
Chat mensajes para todos los chats de una organización donde está instalada una aplicación de Teams determinada.
No admitida. No admitida. Chat. Read.WhereInstalled, Chat. ReadWrite.WhereInstalled
contact Contacts.Read Contacts.Read Contacts.Read
conversationMember
/chats/getAllMembers
Miembros de todos los chats de una organización.
No admitida. No admitida. ChatMember.Read.All, ChatMember.ReadWrite.All, Chat.ReadBasic.All, Chat.Read.All, Chat.ReadWrite.All.
conversationMember
/chats/{id}/members
Miembros de un chat en particular.
ChatMember.Read, ChatMember.ReadWrite, Chat.ReadBasic, Chat.Read, Chat.ReadWrite No admitida. 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
Miembros del chat para todos los chats de una organización donde está instalada una aplicación de Teams determinada.
No admitida. No admitida. ChatMember.Read.WhereInstalled, ChatMember.ReadWrite.WhereInstalled, Chat. ReadBasic.WhereInstalled, chat. Read.WhereInstalled, Chat. ReadWrite.WhereInstalled
conversationMember
/teams/getAllMembers
Miembros de todos los equipos de una organización.
No admitida. No admitida. TeamMember.Read.All, TeamMember.ReadWrite.All
conversationMember
/teams/{id}/members
Miembros de un equipo en particular.
TeamMember.Read.All No admitida. TeamMember.Read.All
conversationMember
/teams/{id}/channels/getAllMembers
Miembros de todos los canales privados de un equipo determinado.
No admitida. No admitida. ChannelMember.Read.All
conversationMember
/teams/getAllChannels/getAllMembers
No admitida. No admitida. ChannelMember.Read.All
driveItem (OneDrive personal del usuario) No admitida. Files.ReadWrite No admitida.
driveItem (OneDrive para el trabajo o la escuela) Files.ReadWrite.All No admitida. Files.ReadWrite.All
evento Calendars.Read Calendars.Read Calendars.Read
grupo Group.Read.All No admitida. Group.Read.All
conversación de grupo Group.Read.All No admitida. No admitida.
Alerta de supervisión de Microsoft Entra Health
/reports/healthmonitoring/alerts
HealthMonitoringAlertConfig.ReadWrite.All No admitida. HealthMonitoringAlertConfig.ReadWrite.All
lista Sites.ReadWrite.All No admitida. Sites.ReadWrite.All
message Mail.ReadBasic, Mail.Read Mail.ReadBasic, Mail.Read Mail.Read
offerShiftRequest
/teams/{id}/schedule/offerShiftRequests
Cambios en cualquier solicitud de turno de oferta en un equipo.
Schedule.Read.All, Schedule.ReadWrite.All No admitida. Schedule.Read.All, Schedule.ReadWrite.All
onlineMeeting No admitida. No admitida. OnlineMeetings.Read.All, OnlineMeetings.ReadWrite.All*
openShiftChangeRequest
/teams/{id}/schedule/openShiftChangeRequests
Cambios en cualquier solicitud de turno abierto en un equipo.
Schedule.Read.All, Schedule.ReadWrite.All No admitida. Schedule.Read.All, Schedule.ReadWrite.All
presencia Presence.Read.All No admitida. No admitida.
printer No admitida. No admitida. Printer.Read.All, Printer.ReadWrite.All
printTaskDefinition No admitida. No admitida. PrintTaskDefinition.ReadWrite.All
alerta de seguridad SecurityEvents.ReadWrite.All No admitida. SecurityEvents.ReadWrite.All
shift
/teams/{id}/schedule/shifts
Cambios en cualquier turno de un equipo.
Schedule.Read.All, Schedule.ReadWrite.All No admitida. Schedule.Read.All, Schedule.ReadWrite.All
swapShiftsChangeRequest
/teams/{id}/schedule/swapShiftsChangeRequests
Cambios en cualquier solicitud de cambio de turno en un equipo.
Schedule.Read.All, Schedule.ReadWrite.All No admitida. Schedule.Read.All, Schedule.ReadWrite.All
team
/teams
Todos los equipos de una organización.
No admitida. No admitida. Team.ReadBasic.All, TeamSettings.Read.All
team
/teams/{id}
Un equipo en particular.
Team.ReadBasic.All, TeamSettings.Read.All No admitida. Team.ReadBasic.All, TeamSettings.Read.All
timeOffRequest
/teams/{id}/schedule/timeOffRequests
Cambios en cualquier solicitud de tiempo libre de un equipo.
Schedule.Read.All, Schedule.ReadWrite.All No admitida. Schedule.Read.All, Schedule.ReadWrite.All
todoTask Tasks.ReadWrite Tasks.ReadWrite Tasks.ReadWrite.All
usuario User.Read.All User.Read.All User.Read.All
virtualEventWebinar VirtualEvent.Read No admitida. VirtualEvent.Read.All
virtualEventTownhall VirtualEvent.Read No admitida. VirtualEvent.Read.All
baseTask (obsoleto) Tasks.ReadWrite Tasks.ReadWrite No admitida.

Nota:

Los permisos siguientes usan el consentimiento específico del recurso:

  • 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

Se puede especificar que las suscripciones a chatMessage incluyan datos de recursos (includeResourceData establecido en true). En ese caso, se requiere cifrado y se produce un error en la creación de la suscripción si no se especifica un encryptionCertificate para dichas suscripciones.

Use el encabezado de Prefer: include-unknown-enum-members solicitud para obtener los siguientes valores en chatMessagemessageTypeevolvable enum:systemEventMessage for /teams/{id}/channels/{id}/messages y /chats/{id}/messages resource.

conversationMember

Las suscripciones conversationMember se pueden especificar para incluir datos de recursos (includeResourceData establecido en true). En ese caso, se requiere cifrado y se produce un error en la creación de la suscripción si no se especifica un encryptionCertificate para dichas suscripciones.

Equipo, canal y chat

Se pueden especificar suscripciones de equipo, canal y chat para incluir datos de recursos (includeResourceData establecido en true). En ese caso, se requiere cifrado y se produce un error en la creación de la suscripción si no se especifica un encryptionCertificate para dichas suscripciones.

Puede usar el parámetro de cadena de consulta notifyOnUserSpecificProperties al suscribirse a cambios en un chat determinado o en el nivel de usuario. Al establecer el parámetro de cadena de consulta notifyOnUserSpecificProperties durante true la creación de la suscripción, se envían dos tipos de cargas al suscriptor. Un tipo contiene propiedades específicas del usuario y el otro se envía sin ellas. Para obtener más información, consulte Obtener notificaciones de cambios para chats con Microsoft Graph.

aiInsights

Las suscripciones a Copilot AI Insights requieren una licencia válida de Copilot que incluya el siguiente plan de servicio de Copilot:

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

aiInteracción

Las suscripciones en interacciones de IA de Copilot requieren una licencia válida de Copilot que incluya el siguiente plan de servicio de Copilot:

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

En el caso de las suscripciones que se centran en las interacciones de IA de Copilot de las que forma parte un usuario determinado, el usuario de la ruta de acceso del recurso debe tener asignados los planes de servicio anteriores en un estado válido.

En el caso de las suscripciones que se dirigen a las interacciones de IA de Copilot para todo el inquilino, el inquilino debe tener licencias válidas aprovisionadas que incluyan todos los planes de servicio anteriores de Copilot.

driveItem

Se aplican más limitaciones a las suscripciones de elementos de OneDrive. Estas limitaciones se aplican para crear y administrar (obtener, actualizar y eliminar) las suscripciones.

En OneDrive personal, puede suscribirse a la carpeta raíz o a cualquier subcarpeta de la unidad. En OneDrive para el trabajo o la escuela, solo puede suscribirse a la carpeta raíz. Se envían notificaciones de cambios para los cambios solicitados en la carpeta suscrita o en cualquier archivo, carpeta u otras instancias de driveItem en su jerarquía. No puede suscribirse a instancias de unidad o elemento de unidad que no sean carpetas, como archivos individuales.

OneDrive para el trabajo o la escuela y soporte técnico de SharePoint enviando a su aplicación notificaciones de eventos de seguridad que se producen en un elemento de unidad. Para suscribirse a estos eventos, agregue el prefer:includesecuritywebhooks de usuario a su solicitud para crear una suscripción. Una vez creada la suscripción, recibirá notificaciones cuando cambien los permisos de un elemento. Este encabezado se aplica a SharePoint y OneDrive profesional o educativo, pero no a las cuentas de OneDrive de consumidor.

contactos, eventos y mensajes

Puede suscribirse a los cambios en los recursos de contactos, eventos o mensajes de Outlook y, opcionalmente, especificar en la carga de solicitud POST si se incluirán datos de recursos cifrados en las notificaciones.

Crear y administrar (obtener, actualizar y eliminar) una suscripción requiere un ámbito de lectura para el recurso. Por ejemplo, para obtener notificaciones de cambio de mensajes, la aplicación necesita el permiso Mail.Read. Las notificaciones de cambio de Outlook admiten ámbitos de permisos delegados y de aplicación. Tenga en cuenta las siguientes limitaciones:

  • El permiso delegado es compatible con la suscripción a los elementos en las carpetas que se encuentran solo en el buzón del usuario que ha iniciado sesión. Por ejemplo, no puede usar el permiso delegado Calendars.Read para suscribirse a eventos del buzón de otro usuario.

  • Para suscribirse y cambiar las notificaciones de eventos, contactos o mensajes de Outlook en carpetas compartidas o delegadas:

    • Use los permisos de aplicación correspondientes para suscribirse a los cambios de los elementos de una carpeta o un buzón de cualquier usuario del espacio empresarial.
    • No use los permisos de uso compartido de Outlook (Contacts.Read.Shared, Calendars.Read.Shared, Mail.Read.Shared y sus homólogos de lectura y escritura), ya que no admiten la suscripción para cambiar las notificaciones de los elementos de las carpetas compartidas o delegadas.

onlineMeetings, presence

Las suscripciones en onlineMeetings y presence requieren la propiedad encryptionCertificate y encryptionCertificateId al crear una suscripción para notificaciones con datos de recursos cifrados. Para obtener más información, consulte la configuración de notificaciones de cambios para incluir datos de recursos. Para obtener más información sobre las suscripciones a reuniones en línea, consulte Obtener notificaciones de cambios para reuniones en línea.

virtualEventWebinar y virtualEventTownhall

Las suscripciones a eventos virtuales solo admiten notificaciones básicas y se limitan a unas pocas entidades de un evento virtual. Para obtener más información sobre los tipos de suscripción admitidos, consulte Obtener notificaciones de cambios para las actualizaciones de eventos virtuales de Microsoft Teams.

Solicitud HTTP

POST /subscriptions

Encabezados de solicitud

Nombre Tipo Descripción
Authorization string {token} de portador. Obligatorio. Obtenga más información sobre autenticación y autorización.

Cuerpo de la solicitud

En el cuerpo de la solicitud, proporcione una representación JSON del objeto de suscripción.

Respuesta

Si se realiza correctamente, este método devuelve un código de 201 Created respuesta y un objeto de suscripción en el cuerpo de la respuesta.

Vea Respuestas de error para obtener detalles sobre la manera en que se devuelven los errores.

Ejemplo

Solicitud

En el cuerpo de la solicitud, proporcione una representación JSON del objeto subscription. Los campos clientState y latestSupportedTlsVersion son opcionales.

Esta solicitud crea una suscripción para las notificaciones de cambios sobre el nuevo correo que recibe el usuario que ha iniciado sesión actualmente.

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"
}

En el cuerpo de la solicitud, proporcione una representación JSON del objeto subscription. Los campos clientState y latestSupportedTlsVersion son opcionales.

Comportamiento de suscripción duplicado

No se permiten suscripciones duplicadas. Cuando una solicitud de suscripción contiene los mismos valores para changeType y resource que contiene una suscripción existente, se produce un error en la solicitud con un código 409 Conflictde error HTTP y el mensaje Subscription Id <> already exists for the requested combinationde error.

Ejemplos de recursos

Los siguientes son valores válidos para la propiedad de recurso.

Tipo de recurso Ejemplos
approvalItems solution/approval/approvalItems
callRecord communications/callRecords
grabación de llamadas communications/onlineMeetings/getAllRecordings, communications/onlineMeetings/{onlineMeetingId}/recordings, users/{userId}/onlineMeetings/getAllRecordings, appCatalogs/teamsApps/{id}/installedToOnlineMeetings/getAllRecordings
Transcripción de llamadas communications/onlineMeetings/getAllTranscripts, communications/onlineMeetings/{onlineMeetingId}/transcripts, users/{userId}/onlineMeetings/getAllTranscripts, appCatalogs/teamsApps/{id}/installedToOnlineMeetings/getAllTranscripts
channel /teams/getAllChannels, /teams/{id}/channels
chat /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
evento me/events
grupo groups
conversación de grupo groups('{id}')/conversations
alerta de supervisión de mantenimiento reports/healthmonitoring/alerts
list sites/{site-id}/lists/{list-id}
message me/mailfolders('inbox')/messages, me/messages
onlineMeeting /communications/onlineMeetings/?$filter=JoinWebUrl eq '{JoinWebUrl}'
presencia /communications/presences/{id} (usuario único), /communications/presences?$filter=id in ('{id}','{id}',…) (varios usuarios)
printer print/printers/{id}/jobs
printTaskDefinition print/taskDefinitions/{id}/tasks
team /teams, /teams/{id}
user users
todoTask /me/todo/lists/{todoTaskListId}/tasks
alerta de seguridad security/alerts?$filter=status eq 'NewAlert'
baseTask (obsoleto) /me/tasks/lists/{Id}/tasks

Nota:

Cualquier ruta de acceso que comience me por también se puede usar con users/{id} en lugar de me para dirigirse a un usuario específico en lugar del usuario actual.

Respuesta

En el ejemplo siguiente se muestra la respuesta.

Nota: Se puede acortar el objeto de respuesta que se muestra aquí para mejorar la legibilidad.

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"
}

Ejemplo 2: Crear una suscripción destinada a un punto de conexión de inserción web

En el ejemplo siguiente se crea una suscripción que entrega notificaciones de cambios cifradas a un punto de conexión de inserción web nativo del explorador (como web.push.apple.com, fcm.googleapis.com, o updates.push.services.mozilla.com).

Antes de crear esta suscripción, la aplicación basada en explorador debe:

  1. Llame a la función getVapidPublicKey de la colección de suscripciones para obtener la clave pública VAPID de Microsoft Graph (RFC 8292).
  2. Llame PushManager.subscribe({ applicationServerKey: <vapidPublicKey> }) para registrarse con el servicio push del explorador. El explorador devuelve un PushSubscription , , y auth valores que contienenendpointp256dh.

Después, la aplicación crea la suscripción con notificationUrl establecido en la dirección URL del punto de conexión de servicio de inserción desnuda y las propiedades vapidPublicKey, webPushEncryptionP256dhPublicKey y webPushEncryptionSecret establecidas en los valores devueltos por el explorador. Después de la creación, Microsoft Graph cifra cada notificación por RFC 8291 con las claves almacenadas y firma la solicitud con VAPID antes de publicarla en el servicio de inserción.

Solicitud

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..."
}

Nota: La propiedad webPushEncryptionSecret es de solo escritura. Nunca se devuelve en GET las respuestas (devuelto como null). Trate el valor como un secreto.

Validación de extremo de notificación

El punto de conexión de notificación de suscripción (especificado en la propiedad notificationUrl ) debe ser capaz de responder a una solicitud de validación, tal como se describe en Configurar notificaciones para cambios en los datos de usuario. Si se produce un error de validación, la solicitud para crear la suscripción devuelve un error 400 de solicitud incorrecta.