/calendar/v1/sync/webhooks/microsoftMicrosoft Graph change-notification URL
Public. Answers the validationToken handshake; otherwise authenticated per notification by clientState, and only schedules a sync. Items are validated before any database work, deduplicated by subscription, and at most ten subscriptions are handled per request; each subscription and each source is rate limited in-process.
- App
- Calendar
- Contract
- Calendar API 1.20.0
- Lifecycle
- preview
- Runtime
- restricted
- Operation ID
- receiveMicrosoftGraphNotification
- Canonical origin
- https://calendar.runonvision.com
Availability: This is a preview contract with runtime status restricted. Publication documents an approved interface; it does not imply public production access.
Purpose and use cases
Microsoft Graph change-notification URL
The owning App is Vision Calendar. Calendar owns scheduling resources, workspace and actor bindings, visibility, recurrence, conflict, and concurrency rules.
Request
POST https://calendar.runonvision.com/calendar/v1/sync/webhooks/microsoft
Authentication and authorization
No authentication requirement is declared for this operation.
Headers
Accept: application/json— recommended where a JSON response is declared.Content-Type: application/json— required for the documented request representation.
Undeclared tracing, idempotency, conditional-request, and version headers are not assumed on this page.
Path and query parameters
| Name | Location | Type | Rules | Description |
|---|---|---|---|---|
| validationToken | query | string | optional; maximum length 2048 | Not described in the contract. |
Request body
Media type: application/json. The body is optional.
objectRunnable examples
Placeholder values are generated from the approved schema and are not live credentials or customer data. Replace every angle-bracket or shell variable value. Examples cannot be run until the App has a routed base URL and your client has the required grant.
curl 'https://calendar.runonvision.com/calendar/v1/sync/webhooks/microsoft' \
--request POST \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '{}'const response = await fetch('https://calendar.runonvision.com/calendar/v1/sync/webhooks/microsoft', {
method: 'POST',
headers: {
accept: 'application/json',
'content-type': 'application/json',
},
body: JSON.stringify({}),
}
if (!response.ok) throw new Error(`Vision API ${response.status}`)
const result = await response.json()import json
import urllib.parse
import urllib.request
request = urllib.request.Request(
'https://calendar.runonvision.com/calendar/v1/sync/webhooks/microsoft',
data=json.dumps({}).encode(),
headers={
"Accept": "application/json",
"Content-Type": "application/json"
},
method='POST',
)
with urllib.request.urlopen(request, timeout=30) as response:
result = json.load(response)The current TypeScript reference client covers Platform token exchange and core reads. No native SDK helper is declared for this operation; use the HTTP contract directly and follow the SDK guidance.
Responses
| Status | Meaning | Schema |
|---|---|---|
| 200 | validationToken echoed | string |
| 202 | Received | not specified |
| 400 | Malformed validation token | not specified |
| 429 | Too many notifications from this source in the last minute. Nothing was processed. | not specified |
Success response schema
string"<response>"Errors and troubleshooting
Error bodies and codes are shown only where the approved contract declares them. Use status, the declared error schema, and any correlation identifier returned by the App; do not infer that two Apps share one envelope.
400— Malformed validation token429— Too many notifications from this source in the last minute. Nothing was processed.
Collection behavior
Pagination: not declared. Filtering/search: not declared. Sorting: not declared.
Cursor lifetime, cursor binding, stable ordering, maximum traversal, and unknown-filter behavior are not assumed unless stated by a parameter description or schema constraint above.
Operational behavior
- Rate limit: The operation declares 429, but the numeric policy is not in OpenAPI.
- Retry: Retry only when the documented error model or response headers authorize it. Timeout and backoff values are not declared by this operation.
- Idempotency: No idempotency header or replay window is declared.
- Concurrency: No ETag, If-Match, or optimistic-version header is declared.
Security and privacy
- Keep client credentials and bearer tokens on trusted servers.
- Send only to the exact approved HTTPS origin and audience.
- Treat response data according to the owning App's classification and retention policy; the OpenAPI contract does not itself grant data access.
- Do not log credentials, tokens, complete private payloads, or secrets.
Edge cases and known documentation gaps
- One or more parameters have no field-level description.
- The request body has no purpose or conditional-rule description.
- Business roles, timeout, retry budget, rate value, idempotency window, and concurrency behavior are absent unless explicitly stated above.
Related operations and workflows
- GET /calendar/v1/sync/connections — The caller's connected Google, Microsoft and Zoom accounts
- POST /calendar/v1/sync/connection-commands — Connect, choose calendars, resync or disconnect an account
- GET /calendar/v1/sync/ics-subscriptions — The caller's subscribed iCal feeds
- POST /calendar/v1/sync/ics-subscription-commands — Subscribe to, refresh or remove an iCal feed counted as busy time
- GET /calendar/v1/sync/feeds — The caller's private published iCal feeds
- POST /calendar/v1/sync/feed-commands — Create, reset or revoke a private iCal feed link
- GET /calendar/v1/sync/conferencing — The caller's default meeting link and which options are usable now
- POST /calendar/v1/sync/conferencing-preference-commands — Set the caller's default meeting link
Contract history and evidence
- Contract version:
1.20.0 - Approved snapshot SHA-256:
ebe491ac249e2cc93315a3ec00300e10f78a28f3ed93d8f232d33320de6e876c - Approval: Anthony, 2026-11-03T01:23:28.663Z (anthony-docs-live-20261102)
- Download the authoritative OpenAPI 3.1 snapshot