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.
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
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
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
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
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
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.
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.
{
"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
}
]
}
}
]
}A walk through the JSON envelope, the Adaptive Card 1.5 root, and the per-alert body — drawn from sendTeams() verbatim.
| Field | Source | Notes |
|---|---|---|
| type | envelope | always message — the connector expects a Messages.WebhookEnvelope. |
| attachments[0].contentType | envelope | always application/vnd.microsoft.card.adaptive (Microsoft Teams card MIME type). |
| attachments[0].content.$schema | adaptive card | always http://adaptivecards.io/schemas/adaptive-card.json. |
| attachments[0].content.type | adaptive card | always AdaptiveCard — the Adaptive Card 1.5 root type. |
| attachments[0].content.version | adaptive card | always 1.5 — Teams Connectors render the full 1.5 body schema. |
| attachments[0].content.body[…].type | per-alert | always TextBlock — one TextBlock per payload line. |
| attachments[0].content.body[…].text | per-alert | one TextBlock per payload line: title, severity, failure_mode, confidence, viewer_impact, remediation_applied, and a deep link. |
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.
| Scope | Severity | Channel | Webhook convention |
|---|---|---|---|
| critical / sev1 | critical | #streamwake-critical | One 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-warn | A 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-info | Resolved 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-manifest | Route 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-cdn | cDN-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-encoder | Encoder-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-drm | DRM-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"). |
- 1.Open the affected channel → ••• → Connectors → Incoming Webhook → Configure → + Add.
- 2.Generate a fresh URL; copy it the moment Teams shows it (Teams won't reshow the URL after this dialog closes).
- 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. 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.
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.
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.