Use Speak AI with Slack
Push transcripts, summaries, and AI insights from Speak into any Slack channel. Connect Slack to Speak in two clicks via OAuth, or wire up a custom Incoming Webhook flow for full control. Native bidirectional integration. Production-ready in under 10 minutes.
Hva du kan gjøre
Once Speak is connected to Slack, every transcribed call, interview, or recording can land in the channel where work happens. Sales teams get deal-call summaries in their pipeline channel. Support teams get sentiment alerts in their on-call channel. Research teams get verbatim quotes pushed to their synthesis channel.
Push transcripts to any Slack channel
One-click OAuth connects your Slack workspace to Speak. Pick a channel, send the full transcript or just the AI summary. Use Speak’s POST /v1/integration/slack/send-transcription endpoint to fire transcripts programmatically from your CRM or scheduler.
Auto-notify on every media.analyzed
Subscribe a Slack Incoming Webhook to Speak’s media.analyzed event. Every time a recording finishes processing, Speak posts a Block Kit card to your chosen Slack channel with the summary, sentiment, and a link back to the full Speak record.
Run Magic Prompts against transcripts from a slash command
Let your team query Speak from Slack. Build a custom slash command (/speak eller /ask-speak) that pipes through your server, calls Speak’s Magic Prompt API, and replies back into the Slack thread with the answer.
Search every call from Claude, ChatGPT, and Slack
Speak’s official MCP server exposes 83 tools to AI assistants. Pair it with Slack’s AI Assistant API or a custom bot to let your team ask questions about the entire Speak library directly in Slack threads.
Konfigurer på 3 trinn
Two production paths. Native OAuth for the in-app experience (recommended). Incoming Webhook for full control over message formatting and routing logic.
Registrer deg for Speak AI
Opprett en gratis konto på app.speakai.co. Du får en 7-dagers prøveperiode med full tilgang. Intet kredittkort nødvendig. Når du er inne, gå til Settings > API og kopier din API-nøkkel.
Velg integrasjonsveien din
I Speak, gå til Settings > Integrations > Slack og klikk Koble til Slack. Approve the OAuth scopes for the workspace and channels you want to use. Speak then exposes a channel picker, the send-transcription endpoint, and a Slack Events API subscription. No code required.
Create a Slack app at api.slack.com/apps, enable Incoming Webhooks, and copy the webhook URL. Subscribe Speak’s media.analyzed webhook (POST /v1/webhook) to your handler, then forward formatted Block Kit messages to the Slack webhook URL. Best when you need custom routing or formatting.
Add a slash command in your Slack app pointing to /slack/command on your server. Your handler reads text og channel_id, fires Speak’s Magic Prompt API, polls for the answer, and posts back to Slack via response_url. Useful for ad-hoc team queries.
Already have calls in Speak? Connect Claude Desktop with npx @speakai/mcp-server init, or add the MCP URL to your Slack AI Assistant. Your team queries the Speak library through conversation in any thread.
Abonner på media.analyzed
Speak sender en signert webhook når transkripsjon og AI-analyse er fullført (vanligvis innen 60 sekunder for et 10-minutters anrop). Registrer endepunktet ditt via POST /v1/webhook, format the payload as a Slack Block Kit card, and post it to your channel. Real-time team awareness, zero polling.
Virkelige arbeidsflyter, virkelige resultater
Four production patterns Speak customers ship with Slack. Pick the one that fits your team and copy the recipe.
Connect Slack via OAuth and send transcripts from your code
Use Speak’s native Slack integration. Connect Slack via OAuth in the Speak dashboard once, then call Speak’s send-transcription endpoint with the mediaId, channelId, og accountId from your CRM, automation, or a webhook handler. No Block Kit construction, no Slack signing required, full markdown rendering of the transcript.
# In Speak AI dashboard:
# 1. Go to Settings -> Integrations -> Slack
# 2. Click "Connect Slack"
# 3. Choose your Slack workspace + channels you want to enable
# 4. Approve scopes (chat:write, channels:read, users:read, files:write)
# 5. Speak stores an accountId you reference from the API
# Or hit Speak's connect endpoint programmatically:
curl -X POST https://api.speakai.co/v1/integration/slack/connect
-H "x-speakai-key: $SPEAK_API_KEY"
-H "Content-Type: application/json"
-d '{"code": "$SLACK_OAUTH_CODE", "redirectUri": "https://yourapp/slack-redirect"}'
curl https://api.speakai.co/v1/integration/slack/$ACCOUNT_ID/channels
-H "x-speakai-key: $SPEAK_API_KEY"
# Response:
# {
# "status": "success",
# "data": {
# "channels": [
# { "id": "C0123ABCD", "name": "deals-pipeline" },
# { "id": "C0123EFGH", "name": "support-oncall" },
# ...
# ]
# }
# }
curl -X POST https://api.speakai.co/v1/integration/slack/send-transcription
-H "x-speakai-key: $SPEAK_API_KEY"
-H "Content-Type: application/json"
-d '{
"mediaId": "14c8dd9c0a89",
"channelId": "C0123ABCD",
"channelName": "deals-pipeline",
"accountId": "$SLACK_ACCOUNT_ID"
}'
# Speak posts the formatted transcript card to the channel.
# AI summary, speaker labels, sentiment chip, link back to the Speak record.
// Trigger this from your CRM, scheduler, or a Speak webhook handler.
async function pushTranscriptToSlack({ mediaId, channelId, channelName, accountId }) {
const r = await fetch(
"https://api.speakai.co/v1/integration/slack/send-transcription",
{
method: "POST",
headers: {
"x-speakai-key": process.env.SPEAK_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ mediaId, channelId, channelName, accountId }),
}
);
if (!r.ok) throw new Error(`Slack push failed: ${r.status}`);
return r.json();
}
import os, requests
def push_transcript_to_slack(media_id: str, channel_id: str, channel_name: str, account_id: str):
r = requests.post(
"https://api.speakai.co/v1/integration/slack/send-transcription",
headers={
"x-speakai-key": os.environ["SPEAK_API_KEY"],
"Content-Type": "application/json",
},
json={
"mediaId": media_id,
"channelId": channel_id,
"channelName": channel_name,
"accountId": account_id,
},
timeout=30,
)
r.raise_for_status()
return r.json()
Speak handles the Slack auth, signing, retry, and Block Kit formatting on its side. You only pass the four IDs.
Auto-post AI summaries to Slack when a recording finishes
For full control over message formatting and routing logic, subscribe Speak’s media.analyzed webhook to your own handler. Fetch the insight from Speak, format it as a Slack Block Kit card, and POST to a Slack Incoming Webhook URL. Useful when different folder tags should route to different channels, or when you want to surface only certain sentiment thresholds.
# 1. Go to https://api.slack.com/apps
# 2. Click "Create New App" -> "From scratch"
# 3. Name it (e.g. "Speak AI Bot") and choose your workspace
# 4. Under Features, enable "Incoming Webhooks"
# 5. Click "Add New Webhook to Workspace"
# 6. Pick the channel that will receive Speak summaries
# 7. Copy the Webhook URL (https://hooks.slack.com/services/T.../B.../xxx)
# Store the URL as an env var: SLACK_WEBHOOK_URL
# Same URL is reusable for every recording analyzed by Speak.
media.analyzed webhookcurl -X POST https://api.speakai.co/v1/webhook
-H "x-speakai-key: $SPEAK_API_KEY"
-H "Content-Type: application/json"
-d '{
"callbackUrl": "https://your-app.example.com/speak/slack-webhook",
"events": ["media.analyzed"],
"description": "Forward Speak insights to Slack"
}'
// Speak posts a thin notification: { eventType, state, mediaId } (verified 2026-05-07).
import express from "express";
const app = express();
app.use(express.json());
app.post("/speak/slack-webhook", async (req, res) => {
const { eventType, state, mediaId } = req.body;
if (eventType !== "media.analyzed" || state !== "processed") return res.sendStatus(204);
res.sendStatus(202);
// 1. Fetch full insight from Speak
const insight = await fetch(
`https://api.speakai.co/v1/media/insight/${mediaId}`,
{ headers: { "x-speakai-key": process.env.SPEAK_API_KEY } }
).then(r => r.json());
const media = insight.data;
const compound = media.sentiment?.[0]?.document?.Compound ?? 0;
const sentiment = compound > 10 ? ":green_circle: Positive"
: compound < -10 ? ":red_circle: Negative" : ":white_circle: Neutral";
// 2. Build a Slack Block Kit card
const blocks = [
{
type: "header",
text: { type: "plain_text", text: media.name },
},
{
type: "section",
fields: [
{ type: "mrkdwn", text: `*Sentiment*n${sentiment} (${compound})` },
{ type: "mrkdwn", text: `*Duration*n${Math.round(media.duration?.inSecond / 60)} min` },
],
},
{
type: "actions",
elements: [{
type: "button",
text: { type: "plain_text", text: "Open in Speak" },
url: `https://app.speakai.co/media/${mediaId}`,
}],
},
];
// 3. POST to Slack Incoming Webhook
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ blocks }),
});
});
app.listen(3000);
import os, requests
from fastapi import FastAPI, Request
app = FastAPI()
@app.post("/speak/slack-webhook")
async def hook(req: Request):
body = await req.json()
if body.get("eventType") != "media.analyzed" or body.get("state") != "processed":
return {"ok": True}
media_id = body["mediaId"]
insight = requests.get(
f"https://api.speakai.co/v1/media/insight/{media_id}",
headers={"x-speakai-key": os.environ["SPEAK_API_KEY"]},
timeout=30,
).json()["data"]
compound = (insight.get("sentiment") or [{}])[0].get("document", {}).get("Compound", 0)
sentiment_emoji = ":green_circle: Positive" if compound > 10 else ":red_circle: Negative" if compound < -10 else ":white_circle: Neutral"
blocks = [
{"type": "header", "text": {"type": "plain_text", "text": insight["name"]}},
{"type": "section", "fields": [
{"type": "mrkdwn", "text": f"*Sentiment*n{sentiment_emoji} ({compound})"},
{"type": "mrkdwn", "text": f"*Duration*n{round(insight.get('duration', {}).get('inSecond', 0) / 60)} min"},
]},
{"type": "actions", "elements": [{
"type": "button",
"text": {"type": "plain_text", "text": "Open in Speak"},
"url": f"https://app.speakai.co/media/{media_id}",
}]},
]
requests.post(
os.environ["SLACK_WEBHOOK_URL"],
json={"blocks": blocks},
timeout=15,
)
return {"ok": True}
Branch by folder ID, tag, or sentiment threshold to route different recording types into different Slack channels. Slack Incoming Webhooks accept up to 50 blocks per message.
Let your team query Speak from Slack
Add a slash command (/speak eller /ask-speak) that fires Speak’s Magic Prompt API and posts the answer back into the Slack thread. Useful for asking ad-hoc questions about a specific call without leaving Slack: “What was the customer’s main objection in the call from yesterday?”
# In your Slack app at https://api.slack.com/apps:
# 1. Features -> Slash Commands -> Create New Command
# 2. Command: /ask-speak
# 3. Request URL: https://your-app.example.com/slack/ask-speak
# 4. Short description: Ask a question about a Speak recording
# 5. Usage hint: [mediaId] [your question]
# 6. Reinstall the app to your workspace
# Slack POSTs to your URL with form-encoded body:
# token, team_id, channel_id, user_id, command, text, response_url
#
# Verify the request with the X-Slack-Signature header
# (HMAC-SHA256 with your Slack signing secret).
import express from "express";
import crypto from "crypto";
const app = express();
app.use(express.urlencoded({ extended: false }));
function verifySlack(req) {
const ts = req.headers["x-slack-request-timestamp"];
const sig = req.headers["x-slack-signature"];
const base = `v0:${ts}:${req.rawBody}`;
const hmac = "v0=" + crypto
.createHmac("sha256", process.env.SLACK_SIGNING_SECRET)
.update(base).digest("hex");
return crypto.timingSafeEqual(Buffer.from(hmac), Buffer.from(sig));
}
app.post("/slack/ask-speak", async (req, res) => {
if (!verifySlack(req)) return res.sendStatus(401);
res.json({ response_type: "in_channel", text: "Asking Speak..." }); // ack within 3s
const [mediaId, ...rest] = (req.body.text || "").split(" ");
const prompt = rest.join(" ");
const responseUrl = req.body.response_url;
// Fire Magic Prompt + poll until completed (typical 2-3s)
const headers = { "x-speakai-key": process.env.SPEAK_API_KEY };
await fetch("https://api.speakai.co/v1/prompt/", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
mediaIds: [mediaId], prompt,
isStream: false, isIndividualPrompt: true,
}),
});
let answer = "(timed out)";
for (let i = 0; i < 20; i++) {
await new Promise(r => setTimeout(r, 1000));
const r2 = await fetch(
`https://api.speakai.co/v1/prompt/messages?mediaIds=${mediaId}&pageSize=1`,
{ headers }
);
const j = await r2.json();
const msg = j?.data?.history?.[0]?.messages?.[0];
if (msg?.state === "completed") { answer = msg.answer; break; }
}
// Post answer back to the same Slack thread
await fetch(responseUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ response_type: "in_channel", text: answer }),
});
});
app.listen(3000);
Acknowledge within 3 seconds (Slack timeout) and post the real answer asynchronously to response_url. Magic Prompt typically completes in 2 to 3 seconds for a 50,000-character transcript.
Search every recording from Claude or ChatGPT, then drop answers into Slack
Connect Speak’s MCP server to Claude or ChatGPT. Run a query, copy the structured answer into a Slack thread. Or wire Claude into Slack with the Anthropic Slack app and let your team ask questions in any channel.
# Claude Desktop / Claude Code (oppdager automatisk installasjonen din)
npx @speakai/mcp-server init
# Lim inn Speak API-nøkkelen din når du blir bedt om det. Installasjon tar cirka 2 minutter.
# Claude.ai (web) og ChatGPT MCP-kobling
# Innstillinger > Integrasjoner > Legg til MCP-server
# Fjern-URL: https://api.speakai.co/v1/mcp
# Auth-header: x-speakai-key: YOUR_SPEAK_API_KEY
# Verifiser at forbindelsen svarer:
curl -s https://api.speakai.co/v1/mcp
-H "x-speakai-key: $SPEAK_API_KEY"
-H "Accept: application/json"
2. Eksempelspørsmål teamet ditt kan bruke i dag:
- “Pull the 3 most recent customer calls where pricing was raised as an objection. Format as a Slack-ready summary.”
- “Summarize this week’s support calls by sentiment. Output as a bulleted list I can drop into our oncall Slack channel.”
- “Find the discovery call from last Friday with Acme Corp. Pull the action items and format as Slack mrkdwn.”
- “Compare the 5 longest sales calls this month for discovery completeness. Score each on a 0-10 rubric.”
- “Pull verbatim quotes from research interviews tagged
innføringwhere users mentioned friction. Drop the top 5 in a thread.”
Fungerer med Claude.ai, Claude Desktop, Claude Code og ChatGPT MCP-kontakter. Vis MCP-server →
Why Speak AI + Slack
Slack is where your team works. Speak is where your conversations are analyzed. The combination is how a 5-person sales team and a 5,000-person enterprise both turn every call into immediate team awareness without a Notion or BI hop.
Native OAuth, not just webhooks
Most “Slack integrations” are actually outbound-only Incoming Webhooks. Speak ships full Slack OAuth, channel listing, signed Events API ingestion, and per-account event subscriptions. Two-way connection, not one-way notifications.
Custom Magic Prompts, not fixed reports
Send any structured analysis to any Slack channel. Sentiment thresholds, custom rubrics, MEDDIC scores, competitor mention extraction. Save the prompt once, run it on every recording forever, route the result to the channel where work happens.
MCP-nativ for Claude og ChatGPT
Den offisielle @speakai/mcp-server exposes 83 tools to AI assistants. Pair it with Claude in Slack or ChatGPT to let your team query the entire Speak library through conversation in any channel.
One workspace, every conversation
Speak ingests Zoom, Teams, Meet, Webex, Twilio, Loom, Drive, Dropbox, podcast audio, embedded recorder submissions, and direct uploads. Slack is the front door for the analysis layer of every one of them.
Team stoler på Speak AI for deres viktigste samtaler
4.9 på G2
“Speak AI har vært avgjørende for å transformere hvordan vi håndterer kvalitative data. Transkripsjonsnøyaktigheten er imponerende, og NLP-innsiktene sparer oss timer med manuell analyse.”
Forskning direktør | Konsulentselskap
“Vi byttet fra Otter.ai og dybden på analysen er på et helt annet nivå. Sentimentscoring, nøkkelordekstraksjon og temadetektion skjer automatisk.”
Produktsjef | SaaS-selskap
“Muligheten til å søke gjennom alle kundeanropene våre og trekke ut spesifikke øyeblikk er en game-changer for støtteteamet vårt.”
Leder for kundeopplevelse | Enterprise-teknologi
How to use Speak AI with Slack for transcription and team awareness
Slack is the operating system for most modern teams. Sales pipelines run in deal channels. Support queues run in oncall channels. Research synthesis happens in dedicated insight channels. The challenge is getting structured intelligence about customer conversations into those channels in real time, without forcing your team to leave Slack to read transcripts. Speak AI solves this by treating Slack as a first-class output destination, not an afterthought.
Where Speak fits in the Slack workflow
Speak runs after the call. Recordings flow in from Zoom, Teams, Meet, Webex, Twilio, Loom, Drive, Dropbox, podcast audio, embedded recorder submissions, or direct uploads. Speak transcribes them in 100+ languages, runs AI analysis, and exposes the result through three Slack-facing surfaces: a native OAuth integration with a channel picker, an Incoming Webhook flow for custom routing logic, and a slash-command path for ad-hoc team queries.
Native Slack integration vs Incoming Webhook
The native Slack OAuth path (POST /v1/integration/slack/connect) is the recommended starting point. It exposes a channel picker inside Speak, handles signing, retries, and Block Kit formatting on Speak’s side, and supports two-way events (Slack to Speak via the Events API). Best for teams that want a working integration in 5 minutes with no Block Kit code to maintain.
The Incoming Webhook path is for teams that need custom routing logic. Different folder tags route to different channels. Different sentiment thresholds trigger different message templates. Different custom Magic Prompts produce different Block Kit cards. You write the formatting code; Speak supplies the analysis. Best when the routing logic is non-trivial.
Slash command pattern
The slash command path (Tab 3 above) is ad-hoc, not real-time. A team member types /ask-speak {mediaId} {question} in any Slack channel. Your handler verifies the Slack signature, fires Speak’s Magic Prompt API, polls for the answer (typical completion 2 to 3 seconds), and posts back to the same thread via response_url. Best for one-off questions about specific calls without context-switching to the Speak app.
Authentication and Slack scopes
The native OAuth flow requests these Slack scopes: chat:write (post messages), channels:read (list public channels), users:read (resolve user mentions), files:write (attach transcript files). The Events API path adds commands for slash command handling. Your Speak account stores the Slack accountId reference; the actual OAuth token lives encrypted on Speak’s side.
Real-time vs post-call delivery
Speak posts to Slack after the call ends, with first transcripts typically available within 60 seconds for a 10-minute call. For during-call live captions, use Slack’s native huddle transcription or pair Slack with a real-time transcription provider. Use Speak for the post-call analysis layer that lands in your team channels.
How do I forward Speak transcripts into Slack automatically?
Three production paths, ranked by lift:
- Native OAuth + send-transcription endpoint. Connect Slack in Speak, then call
POST /v1/integration/slack/send-transcriptionmedmediaId,channelId, ogaccountId. Speak handles formatting and posting. Best for most teams. - Incoming Webhook + Block Kit. Subscribe Speak’s
media.analyzedwebhook, fetch the insight, format as Block Kit, POST to your Slack webhook URL. Best for custom routing. - Zapier. Trigger: Speak New Media Analyzed. Action: Slack Send Channel Message. 5-minute setup. Best for SMB teams without engineering bandwidth.
The same patterns work for sales calls, support calls, customer interviews, and recorded internal meetings.
Brukstilfeller etter rolle
Salgs- og RevOps-team push deal-call summaries to a pipeline channel. Magic Prompts score discovery completeness, surface objections, and extract competitor mentions. The whole team sees every call without watching the recording. See Speak AI for salgsgrupper.
Kundeservice- og CX-team route inbound call analysis to oncall channels. Sentiment dips trigger automatic alerts. Cancellation language fires a manager mention. Multilingual support queues work without per-language setup since Speak supports 100+ languages.
Kundeforskningsteam push verbatim quotes from interviews into research synthesis channels. Code themes across the entire library, ask Claude for verbatim quotes via MCP, drop the top hits into a thread. See Speak AI for kvalitativ forskning.
Training and enablement teams turn coaching moments into Slack-accessible content. Speak’s analysis surfaces missed discovery questions and scripted-line drift; the structured output lands in the training channel for review. See Speak AI for training and development.
Ofte stilte spørsmål
Does Speak AI have a native Slack integration?
Yes. Speak ships full Slack OAuth, channel listing, signed Events API ingestion, and per-account event subscriptions. Connect once at Settings > Integrations > Slack in the Speak dashboard. Most teams use this rather than building custom Incoming Webhooks.
How do I post a Speak transcript to a Slack channel?
Two ways. Native: connect Slack in Speak, then call POST /v1/integration/slack/send-transcription with the media ID, channel ID, and Speak account ID. Speak handles formatting and posting. Custom: subscribe Speak’s media.analyzed webhook, fetch the insight, build a Block Kit card, POST to a Slack Incoming Webhook URL. Both paths run in production today.
Can I add a slash command to query Speak from Slack?
Yes. Add a slash command in your Slack app pointing to your server. Your handler verifies the Slack signature, fires Speak’s Magic Prompt API, polls for the answer, and posts back to the same thread via response_url. Acknowledge within 3 seconds (Slack timeout) and post the real answer asynchronously.
What Slack scopes does the native integration request?
The OAuth flow requests chat:write, channels:read, users:read, og files:write for the message-posting flow. Add commands if you wire up the slash-command Events API path. Your Slack workspace admin can pre-approve Speak in the admin console for org-wide rollouts.
Can Speak post to private channels?
Yes, but the Speak app must be invited to the private channel first. Public channels appear in the channel picker automatically once Slack OAuth is approved. For private channels, run /invite @speakai in the channel before listing it via GET /v1/integration/slack/:accountId/channels.
Can I try Speak AI for free with my Slack workspace?
Yes. The 7-day trial includes credits for transcription, full API access, the native Slack OAuth, the send-transcription endpoint, and the MCP server. No credit card required. Connect a Slack workspace, send a test recording, and validate the full pipeline before committing.
Start using Speak AI with Slack today
83 analysis tools. 100+ languages. Native Slack OAuth, Incoming Webhook, slash commands. MCP-native for Claude and ChatGPT. Same workspace as your Zoom, Teams, Webex, and Twilio calls.
Prøv Speak AI gratis
Create your account, connect Slack, and the next recording lands in your channel automatically. Full access for 7 days. No credit card required.
Se API-dokumentasjonen
Full reference for the send-transcription endpoint, webhook event types, the Magic Prompt API, and the Speak Slack Events API path. Plus the Speak Zapier app and the official MCP server on NPM.




