Integration
Streamwake + Microsoft Teams

Streamwake + Microsoft Teams.
One incoming-webhook URL; the agent posts Adaptive Cards.

Pipe every Streamwake incident into the Microsoft Teams channel your rotation already watches. Incoming-webhook-only — no Azure App registration, no OAuth flow, no certificate to provision. The agent formats the incident as an Adaptive Card the moment the loop closes.

The Teams incoming-webhook connector accepts a JSON Adaptive Card envelope and returns 200 on success — Streamwake ships the same shape today, and the URL-only field on the Microsoft Teams card mirrors Slack / Discord byte-for-byte so the path from connector to first card is one form field plus a test event.

How to connect

Five steps from a fresh Teams channel to a delivered Adaptive Card.

The only credential is the incoming-webhook URL — Teams Connectors doesn't require a bot registration, so the whole setup lives inside a channel “Connectors” submenu and a single form field on the Teams card.

  1. 1

    Open (or create) the Teams channel

    Open the Microsoft Teams channel you want Streamwake alerts in — we recommend a new #streamwake channel so rotation chatter and incident cards stay separate.

  2. 2

    Create the incoming-webhook connector

    Click the channel ••• → Connectors → Incoming Webhook → Configure. Name it "Streamwake", upload the Streamwake logo so the card carries the brand, then click Create.

  3. 3

    Copy the webhook URL

    Copy the URL the connector generated — it begins with https://*.office.com/webhook/... (or https://outlook.office.com/webhook/... in older tenants). The URL is the entire credential; treat it like an API key and paste it back into Streamwake right away.

  4. 4

    Paste it into the Teams card

    Sign in to Streamwake at /app/integrations, find the Microsoft Teams card, paste the URL into the Webhook URL field, and click "Send test event". The agent posts a minimal Adaptive Card so you can confirm the connector accepts the format.

  5. 5

    Confirm the card lands + save

    Confirm the Adaptive Card lands in the channel — title (Streamwake agent anomaly: latency spike detected) + wrapped description. Save the URL in Streamwake; optionally enable the daily/weekly digest fan-out on the same card to copy closed incidents into the same channel on a digest cadence.

Alert payload schema

The Adaptive Card JSON
Streamwake posts today.

Verbatim from sendTeams() in /api/v1/integrations/test — the message envelope, the Adaptive Card 1.5 schema, and the inner TextBlocks the agent emits per payload line. Teams Connectors validates against the Adaptive Card 1.5 spec; the JSON below is what passes validation end to end.

Adaptive Card 1.5
application/vnd.microsoft.card.adaptive
POST → webhook URL
{
  "type": "message",
  "attachments": [
    {
      "contentType": "application/vnd.microsoft.card.adaptive",
      "content": {
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "type": "AdaptiveCard",
        "version": "1.5",
        "body": [
          {
            "type": "TextBlock",
            "text": "Streamwake agent anomaly: latency spike detected",
            "weight": "Bolder",
            "size": "Medium"
          },
          {
            "type": "TextBlock",
            "text": "A monitored stream exceeded the p95 latency threshold for 3 consecutive probes.",
            "wrap": true
          }
        ]
      }
    }
  ]
}
Field reference

A walk through the JSON envelope, the Adaptive Card 1.5 root, and the per-alert body — drawn from sendTeams() verbatim.

FieldSourceNotes
typeenvelopealways message — the connector expects a Messages.WebhookEnvelope.
attachments[0].contentTypeenvelopealways application/vnd.microsoft.card.adaptive (Microsoft Teams card MIME type).
attachments[0].content.$schemaadaptive cardalways http://adaptivecards.io/schemas/adaptive-card.json.
attachments[0].content.typeadaptive cardalways AdaptiveCard — the Adaptive Card 1.5 root type.
attachments[0].content.versionadaptive cardalways 1.5 — Teams Connectors render the full 1.5 body schema.
attachments[0].content.body[…].typeper-alertalways TextBlock — one TextBlock per payload line.
attachments[0].content.body[…].textper-alertone TextBlock per payload line: title, severity, failure_mode, confidence, viewer_impact, remediation_applied, and a deep link.
Recommended routing

One webhook per channel,
channel per scope.

The agent emits every incident as a typed severity + failure_mode pair (info / warning / critical + manifest_drift / cdn_brownout / per_title_encoder_regression / drm_cert_failure). One Microsoft Teams card per channel; one inbox per rotation. The table below is the channel convention + the matching webhook convention we recommend on day one.

ScopeSeverityChannelWebhook convention
critical / sev1
critical
#streamwake-criticalOne channel per page-on-call rotation; one webhook URL per channel. Severity is rendered as a prefix in the Adaptive Card title so on-call can triage without opening the card.
warning / sev2
warning
#streamwake-warnA single shared channel for everything below sev1; the channel carries the per-incident Adaptive Card with the typed failure_mode as the title prefix.
info / digest-only
info
#streamwake-infoResolved incidents + daily/weekly digest fan-out lands here — same Adaptive Card shape, but no on-call invocation. Enable the digest toggle on the same Microsoft Teams card to pick this channel up automatically.
manifest drift
warning
#streamwake-manifestRoute manifest_drift incidents to a manifest-specific channel so the packager/encoder rotation can sweep the channel without internetwide noise. Use a fresh webhook URL on this channel so rotation-tracker scripts can give the URL its own TTL.
cdn_brownout
critical
#streamwake-cdncDN-targeted channel — the Adaptive Card carries the per-PoP brownout title prefix (e.g. "cdn_brownout · IAD-PoP-3") so the CDN on-call can pivot to the right PoP before opening the card body.
per_title_encoder_regression
warning
#streamwake-encoderEncoder-rotation channel — one webhook URL per encoder (so a mis-rotated webhook only takes down one encoder, not the whole encoder rotation). Streamwake rotates the webhook URL on save the same way it saves the primary URL.
drm_cert_failure
critical
#streamwake-drmDRM-only channel so the cert-window rotation owner is on it immediately. Title prefix in the Adaptive Card is the cert name (e.g. "drm_cert_failure · Widevine-CA-2026-08").
Webhook rotation
Rotate an expired webhook in four steps
  1. 1.Open the affected channel → ••• → Connectors → Incoming Webhook → Configure → + Add.
  2. 2.Generate a fresh URL; copy it the moment Teams shows it (Teams won't reshow the URL after this dialog closes).
  3. 3. Sign in to Streamwake at /app/integrations, find the Microsoft Teams card, paste the new URL, and click Send test event. The agent posts the same minimal Adaptive Card the test-event flow posts today.
  4. 4. Confirm the card lands; now delete the old connector in the same Teams channel so a leaked URL from before is no longer routable. Mouse-trap leak risk closes on the same rotation.
See the loop run

Run the Free Stream Check,
deliver the alert into Microsoft Teams.

Paste a playback URL into /stream-check — five checks (manifest, segments, bitrate ladder, CDN response, playback errors) in under a minute, no login. Pair it with the Book-a-demo block below for a guided walkthrough of the Adaptive Card payload + the per-severity routing convention on your tenant.

Talk to engineering

Book a 20-minute walkthrough on your Microsoft Teams tenant.

We're happy to walk through the Adaptive Card envelope, the per-severity routing convention, and the webhook-rotation checklist on a real Teams tenant. Drop your details below and we'll follow up within 1 business day.