Skip to main content

How to get a Microsoft Teams webhook URL

A Microsoft Teams webhook URL is an HTTPS address you send a POST request to, and Teams posts the message into a channel. You create one from the Workflows menu on the channel, using the "Post to a channel when a webhook request is received" template. Teams generates the URL and shows it once the flow is saved.

This replaced the older path through Connectors. Microsoft has retired Office 365 connectors inside Teams, so the ••• menu no longer offers "Incoming Webhook" and existing connector URLs stop delivering. Power Automate Workflows is the supported way to get a webhook URL for a Teams channel, and it works on the same idea: one URL per channel, no authentication beyond the secret in the URL itself.

Building webhooks?
Svix is the enterprise ready webhook receiver. With Svix, you can have a secure, reliable, and scalable webhook receiver in minutes. Give it a try!

1. Open Workflows on the channel

Hover the channel you want messages posted to, click the ••• menu, and choose "Workflows". You can also reach it from the ••• menu on the team and pick the channel later.

2. Choose the incoming webhook template

Search for "webhook" and select "Post to a channel when a webhook request is received". Give the flow a name that says where the messages come from, confirm the Teams connection, then pick the team and channel.

3. Copy the webhook URL

Teams creates the flow and displays the URL, which looks like https://prod-12.westus.logic.azure.com:443/workflows/.../triggers/manual/paths/invoke?...&sig=.... Copy it now: the signature in the query string is the only credential, and you cannot see it again from this dialog. If you lose it, open the flow in Power Automate, select the "When a Teams webhook request is received" trigger, and copy the URL from there.

Send a message to the Teams webhook

The Workflows trigger expects an Adaptive Card wrapped in a message attachment, not the plain {"text": "..."} body the old connector accepted:

curl -X POST \
-H 'Content-Type: application/json' \
--data '{
"type": "message",
"attachments": [{
"contentType": "application/vnd.microsoft.card.adaptive",
"content": {
"type": "AdaptiveCard",
"version": "1.4",
"body": [{"type": "TextBlock", "text": "Deploy finished", "wrap": true}]
}
}]
}' \
"https://prod-12.westus.logic.azure.com:443/workflows/..."

A 202 Accepted means Power Automate queued the run. The card appears in the channel a second or two later. If nothing shows up, open the flow's run history in Power Automate: a failed run there usually means malformed card JSON.

If you still have a legacy connector URL

Connector URLs on https://<tenant>.webhook.office.com/webhookb2/... came from the flow below, and older internal tooling may still point at one. Recreate those with Workflows rather than trying to add a new connector.

The ••• overflow menu on a Microsoft Teams channel, where Connectors used to appear

Searching for the Incoming Webhook connector in the Teams connectors dialog

The generated Microsoft Teams incoming webhook URL with a copy button

Keep the URL secure

Anyone holding the URL can post to the channel, so treat it as a secret: keep it in an environment variable or a secrets manager, never in client-side code or source control. To rotate it, delete the flow and create a new one from the same template.

Incoming webhooks only send messages into Teams. If you need your own service to receive webhooks from other providers, that is the harder direction: signature verification, retries, and absorbing traffic spikes. Svix Ingest handles it, and our Slack webhook URL guide covers the equivalent setup for Slack.