---
title: "Handle Notification"
method: POST
path: "/webhooks/teams/graph-notifications"
---

# Handle Notification

`POST /webhooks/teams/graph-notifications`

## Request

- Base URL: `https://api.traversal.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.traversal.com/webhooks/teams/graph-notifications`
- Auth: none declared

Handle a Graph subscription-creation handshake or a batch of notifications.

The handshake is a POST carrying ``?validationToken=`` — Graph expects
that token echoed back verbatim as ``text/plain`` within 10s, nothing
else. Otherwise the body is ``{"value": [notification, ...]}`` (Graph
batches).

Each notification is **verified before any work is scheduled**: the
subscription lookup and ``clientState`` comparison happen here, inline,
so a caller who doesn't hold the secret can't turn one request into a
batch of background tasks. Only the Graph fetch + dispatch half is
deferred, so a slow investigation can't hold up acking the batch. Row
lookups are memoized per request, since a Graph batch is usually many
notifications for one subscription.

Always 202s once the body is parsed, even when individual
notifications were skipped — Graph retries the *whole batch* on a
non-2xx, which would reprocess anything that already succeeded.

## Response `200`

Successful Response

- unknown

---

[API](https://skmtc.dev/traversal/apis/traversal-api.md) - [All operations](https://skmtc.dev/traversal/apis/traversal-api/llms.txt) - [OpenAPI document](https://skmtc.dev/traversal/apis/traversal-api/revisions/31e1a8b7cf89?raw)
