29 KiB
Send YouTube transcripts to Slack using AssemblyAI
https://n8nworkflows.xyz/workflows/send-youtube-transcripts-to-slack-using-assemblyai-12935
Send YouTube transcripts to Slack using AssemblyAI
1. Workflow Overview
Title: Send YouTube transcripts to Slack using AssemblyAI
Workflow name (in JSON): rippr – YouTube Transcript
Purpose:
This workflow lets a Slack user submit a YouTube link via a Slack slash command. The workflow extracts the YouTube video ID, checks the video duration (enforcing a max length), converts the video to MP3 via RapidAPI, uploads the audio to AssemblyAI, polls until transcription is complete, then cleans the transcript using OpenAI and posts the final formatted text back into Slack via Slack’s response_url.
Typical use cases:
- Quickly “rip” a transcript from a YouTube link without leaving Slack.
- Enforce short video limits to control cost/time.
- Produce a readable transcript (cleaned formatting) for sharing in a channel.
1.1 Input Reception (Slack)
Receives Slack slash-command payload and normalizes key fields.
1.2 YouTube URL Parsing + Duration Guardrail
Extracts the YouTube video ID from the Slack text, calls YouTube Data API (via RapidAPI) to get duration, and blocks videos longer than a configured threshold (10 minutes).
1.3 Audio Conversion + AssemblyAI Job Creation
Downloads MP3 audio (RapidAPI), uploads to AssemblyAI, and creates a transcription job.
1.4 Polling for Completion + Transcript Retrieval
Waits and repeatedly checks AssemblyAI job status until it is completed, then extracts the transcript text.
1.5 Cleanup (OpenAI) + Slack Delivery
Uses OpenAI to reformat transcript for readability (not a summary despite the node name), then posts the result back to Slack.
2. Block-by-Block Analysis
Block 1 — Slack Command Intake & Normalization
Overview:
Accepts a Slack slash command request, immediately responds with an “in progress” message, and prepares the payload for downstream nodes.
Nodes involved:
Receive Slack commandNormalize Slack payload
Node: Receive Slack command
- Type / role: Webhook trigger; entrypoint for Slack slash command.
- Configuration choices:
- HTTP Method: POST
- Path:
rippr(Slack slash command should POST to this endpoint) - Immediate response message:
🗡️ Ripping the full transcript… wait a few minutes, I’ll post it here soon (• v •) - Response mode: configured via webhook
options.responseData(static text)
- Inputs/Outputs:
- Input: Slack payload in
body(typical Slack slash command fields liketext,response_url, etc.) - Output: Passes request data to
Normalize Slack payload
- Input: Slack payload in
- Failure/edge cases:
- Slack may retry if webhook does not respond quickly; ensure n8n is reachable and the webhook responds immediately (this node does).
- If Slack signing/verification is required, it is not implemented here (no signature validation).
Node: Normalize Slack payload
- Type / role: Set node; maps/creates a
videoUrlfield from Slack’s request body. - Configuration choices (interpreted):
- Adds/overwrites field
videoUrlusing{{$json["body"]["text"] || ""}} - Include other fields: enabled (passes everything through)
- Adds/overwrites field
- Key expressions/variables:
{{$json["body"]["text"] || ""}}
- Inputs/Outputs:
- Input from
Receive Slack command - Output to
Extract YouTube video ID
- Input from
- Failure/edge cases:
- If Slack payload structure differs (no
body.text),videoUrlbecomes empty. Downstream parsing will fail to find a video ID.
- If Slack payload structure differs (no
Sticky note (applies to this block’s nodes):
“Receives the Slack command and normalizes the incoming payload.”
Block 2 — YouTube ID Extraction & Duration Validation
Overview:
Extracts an 11-character YouTube video ID from multiple possible URL formats, fetches the YouTube video duration via RapidAPI YouTube Data API endpoint, parses ISO-8601 duration, and enforces a 10-minute maximum.
Nodes involved:
Extract YouTube video IDCheck Video DurationParse and validate video durationIs video longer than limit?Send duration error to Slack
Node: Extract YouTube video ID
- Type / role: Code node (JavaScript); robust URL parsing + ID extraction.
- Configuration choices (interpreted):
- Removes a command prefix
"/rippit "from the Slack text (note: your webhook path isrippr, but the code removes/rippit; mismatch is harmless unless users actually type a different command). - Extracts first URL from the text (or treats the entire text as URL).
- Supports forms:
youtube.com/watch?v=VIDEOIDyoutu.be/VIDEOIDyoutube.com/shorts/VIDEOIDyoutube.com/embed/VIDEOID
- Removes a command prefix
- Key expressions/variables:
- Reads Slack text from:
inputJson?.body?.text ?? inputJson?.text ?? '' - Regex:
/(?:youtube\.com\/watch\?v=|youtu\.be\/|shorts\/|embed\/)([A-Za-z0-9_-]{11})/i - Outputs:
{ text, videoUrl, videoId }
- Reads Slack text from:
- Inputs/Outputs:
- Input from
Normalize Slack payload - Output to
Check Video Duration
- Input from
- Failure/edge cases:
- If
videoIdisnull, downstream nodes will call APIs with an invalid ID. There is no explicit guard for “invalid or missing video ID”. - Slack users may paste playlist URLs, channels, or other formats not matching the regex.
- If
Node: Check Video Duration
- Type / role: HTTP Request; calls YouTube Data API via RapidAPI to get
contentDetails.duration. - Configuration choices (interpreted):
- URL:
https://youtube-v31.p.rapidapi.com/videos?part=contentDetails&id={{videoId}} - Auth: HTTP Header Auth credential named
RapidAPI - Header:
x-rapidapi-host: youtube-v31.p.rapidapi.com - (Implicitly requires RapidAPI key header in the credential)
- URL:
- Key expressions/variables:
- Uses
$('Extract YouTube video ID').item.json.videoId
- Uses
- Inputs/Outputs:
- Input: from
Extract YouTube video ID - Output: to
Parse and validate video duration
- Input: from
- Failure/edge cases:
- RapidAPI quota exceeded, invalid key, or wrong host header.
- YouTube API may return empty
itemsfor invalid/private videos; downstream code assumesitems[0]exists.
Node: Parse and validate video duration
- Type / role: Code node; parses ISO 8601 duration and applies max duration rule.
- Configuration choices (interpreted):
- Reads duration from:
$input.item.json.items[0].contentDetails.duration - Parses
PT#H#M#S - Computes total minutes
- Hard-coded limit: 10 minutes
- Does not throw errors; returns
{ error: true, errorMessage: ... }for long videos
- Reads duration from:
- Key expressions/variables:
- Gets original fields from:
$('Extract YouTube video ID').first() - Output includes:
error,errorMessage(if too long),videoId,videoUrl,durationMinutes
- Gets original fields from:
- Inputs/Outputs:
- Input: from
Check Video Duration - Output: to
Is video longer than limit?
- Input: from
- Failure/edge cases:
- If
items[0]missing or duration not matching regex,matchmay benullandmatch[1]will throw. - Limit is embedded in code; changing it requires editing JS.
- If
Node: Is video longer than limit?
- Type / role: IF node; branches based on
error === true. - Configuration choices:
- Condition:
{{$json.error}}equalstrue
- Condition:
- Inputs/Outputs:
- Input: from
Parse and validate video duration - True path:
Send duration error to Slack - False path:
Convert YouTube video to MP3
- Input: from
- Failure/edge cases:
- If prior node fails and doesn’t output
error, condition evaluation may behave unexpectedly.
- If prior node fails and doesn’t output
Node: Send duration error to Slack
- Type / role: HTTP Request; posts an error message back to Slack via
response_url. - Configuration choices:
- URL:
{{$('Receive Slack command').item.json.body.response_url}} - Method: POST
- Body:
text = ❌ {{$json.errorMessage}}
- URL:
- Inputs/Outputs:
- Input: from IF true branch
- Output: none further (end)
- Failure/edge cases:
- If
response_urlmissing (non-Slack invocation), the request fails. - Slack
response_urlexpires after some time; errors posted too late may be rejected.
- If
Sticky note (applies to this block’s nodes):
“Extracts the YouTube video ID and validates video duration before processing.”
Block 3 — Convert YouTube to MP3 & Start AssemblyAI Transcription
Overview:
Downloads the YouTube audio as an MP3 via RapidAPI, uploads the binary to AssemblyAI to obtain an upload_url, then creates a transcription job.
Nodes involved:
Convert YouTube video to MP3Create transcription jobSubmit audio for transcription
Node: Convert YouTube video to MP3
- Type / role: HTTP Request; fetches MP3 file from RapidAPI downloader endpoint.
- Configuration choices (interpreted):
- URL:
https://youtube-mp3-audio-video-downloader.p.rapidapi.com/download-mp3/{videoId}?quality=low - Auth: RapidAPI via HTTP Header Auth credential
RapidAPI - Response:
responseFormat: file- output binary property name:
mp3 fullResponse: trueneverError: true(important: even non-2xx responses won’t hard-fail the node)
- Headers include:
x-rapidapi-host: youtube-mp3-audio-video-downloader.p.rapidapi.comaccept: application/octet-streamcontent-type : application/json(note trailing space in header name; may be ignored by some servers)
- URL:
- Inputs/Outputs:
- Input: from duration check false branch
- Output: binary
mp3toCreate transcription job
- Failure/edge cases:
- Because
neverErroris enabled, failures may appear as “successful” node executions but produce invalid/empty binary, causing AssemblyAI upload to fail. - RapidAPI services can return JSON error bodies instead of binary.
- Because
Node: Create transcription job
- Type / role: HTTP Request; uploads MP3 binary to AssemblyAI
/upload. - Configuration choices (interpreted):
- URL:
https://api.assemblyai.com/v2/upload - Method: POST
- Body type: binary data
- Binary property:
mp3(from previous node) - Header:
content-type: application/octet-stream - Auth: HTTP Header Auth credential
AssemblyAI(expectsauthorization: <api-key>typically) - Response format: JSON; expects
upload_url
- URL:
- Inputs/Outputs:
- Input: binary from
Convert YouTube video to MP3 - Output: JSON including
upload_urltoSubmit audio for transcription
- Input: binary from
- Failure/edge cases:
- Missing/invalid AssemblyAI key → 401.
- Upload size/timeouts for longer videos (even though duration is capped).
- If MP3 binary is not present at
mp3, upload will fail.
Node: Submit audio for transcription
- Type / role: HTTP Request; creates transcription job in AssemblyAI.
- Configuration choices (interpreted):
- URL:
https://api.assemblyai.com/v2/transcript - Method: POST
- JSON body:
{ "audio_url": "{{$json.upload_url}}" } - Header:
content-type: application/json - Auth: AssemblyAI header auth
- URL:
- Inputs/Outputs:
- Input: JSON from upload step
- Output: JSON containing transcription
idtoWait for transcription processing
- Failure/edge cases:
upload_urlmissing → job creation fails.- AssemblyAI may return
errorfields if input is invalid.
Sticky note (applies to this block’s nodes):
“Converts the video to audio and starts the transcription job.”
Block 4 — Wait/Poll for AssemblyAI Completion & Extract Transcript
Overview:
Implements polling: wait 20 seconds, check job status, loop until completed, then extract transcript text.
Nodes involved:
Wait for transcription processingCheck transcription statusExtract transcript textIs transcription complete?
Node: Wait for transcription processing
- Type / role: Wait node; introduces delay between status checks.
- Configuration choices:
- Amount:
20(seconds)
- Amount:
- Inputs/Outputs:
- Input: from
Submit audio for transcription(first loop) OR fromIs transcription complete?false branch (subsequent loops) - Output: to
Check transcription status
- Input: from
- Failure/edge cases:
- Many concurrent executions can accumulate waiting jobs; consider n8n queue/worker capacity.
- No maximum retry count; could loop indefinitely if job stays “processing” or “queued” forever.
Node: Check transcription status
- Type / role: HTTP Request; polls AssemblyAI transcript status endpoint.
- Configuration choices (interpreted):
- URL:
https://api.assemblyai.com/v2/transcript/{{$node["Submit audio for transcription"].json["id"]}} - Response format: JSON (expects
status, and when complete,text) - Auth: AssemblyAI header auth
- URL:
- Inputs/Outputs:
- Input: from
Wait for transcription processing - Output: to
Extract transcript text
- Input: from
- Failure/edge cases:
- If
Submit audio for transcriptiondid not run or has noid, URL becomes invalid. - AssemblyAI errors:
statuscould beerror; the workflow does not explicitly handle this.
- If
Node: Extract transcript text
- Type / role: Code node; maps transcript text into a clean field.
- Configuration choices (interpreted):
- Outputs:
transcript: $json.text ?? ''(from AssemblyAI status response)mode: readsmodefromNormalize Slack payloadif present, else'summary'
- Outputs:
- Key expressions/variables:
($items('Normalize Slack payload', 0, 0)?.json?.mode) || 'summary'- Note:
Normalize Slack payloaddoes not actually setmode, so this defaults to'summary'always unless added elsewhere.
- Inputs/Outputs:
- Input: from
Check transcription status - Output: to
Is transcription complete?
- Input: from
- Failure/edge cases:
- If transcription is not complete,
$json.textis often absent; transcript becomes empty (but completion is checked in next node based onstatusfrom a different node reference).
- If transcription is not complete,
Node: Is transcription complete?
- Type / role: IF node; decides whether to proceed or keep waiting.
- Configuration choices:
- Condition checks:
{{$node[" Check transcription status"].json["status"].toLowerCase()}}equalscompleted - True branch →
Generate AI summary - False branch → loops back to
Wait for transcription processing
- Condition checks:
- Inputs/Outputs:
- Input: from
Extract transcript text - Branching described above
- Input: from
- Failure/edge cases:
- If
statusis missing,.toLowerCase()throws an expression error. - No handling for
status: "error"; it will loop forever.
- If
Sticky note (applies to this block’s nodes):
“Waits for transcription completion and retrieves the final transcript.”
Block 5 — OpenAI Cleanup & Slack Posting
Overview:
Uses OpenAI to reformat transcript into readable paragraphs (despite the node name suggesting summarization), then posts a branded message back to Slack using the original response_url.
Nodes involved:
Generate AI summaryPost result to Slack
Node: Generate AI summary
- Type / role: LangChain OpenAI node (
@n8n/n8n-nodes-langchain.openAi); text transformation. - Configuration choices (interpreted):
- Model:
gpt-4-turbo - System message: instructs model to clean/reformat transcript, explicitly says do not summarize
- User content: transcript from
Extract transcript text
- Model:
- Key expressions/variables:
{{$node["Extract transcript text"].json["transcript"]}}
- Inputs/Outputs:
- Input: from
Is transcription complete?true branch - Output: to
Post result to Slack
- Input: from
- Failure/edge cases:
- OpenAI auth errors, model availability changes, rate limits.
- Token limits for long transcripts; although video is capped at 10 minutes, transcripts can still be sizeable.
- Node name is misleading: it performs cleaning, not summarization.
Node: Post result to Slack
- Type / role: HTTP Request; posts final message to Slack via
response_url. - Configuration choices (interpreted):
- URL:
{{$node["Receive Slack command"].json["body"]["response_url"]}} - Method: POST
- Body parameters:
response_type=in_channel(broadcasts to channel)text=branded header + original video link + OpenAI cleaned transcript
- Pulls content primarily from:
Generate AI summary→message.content- Fallback expression for alternate output shapes
- URL:
- Key expressions/variables:
- Video link:
<{{$node["Extract YouTube video ID"].json["videoUrl"]}}|:film_projector: Original Video> - Transcript content expression:
{{$node["Generate AI summary"].json["message"]["content"] ?? ($json["message"] ? $json["message"][0]["content"] : "")}}
- Video link:
- Inputs/Outputs:
- Input: from
Generate AI summary - Output: end
- Input: from
- Failure/edge cases:
- Slack
response_urlmay expire; long transcription times can cause posting failure. - Slack message length limits; large transcripts may be truncated/rejected. Consider splitting into multiple posts.
- Slack
Sticky note (applies to this block’s nodes):
“Formats the result and sends it back to Slack.”
3. Summary Table
| Node Name | Node Type | Functional Role | Input Node(s) | Output Node(s) | Sticky Note |
|---|---|---|---|---|---|
| Receive Slack command | Webhook | Entry point: receives Slack slash command and responds immediately | — | Normalize Slack payload | Receives the Slack command and normalizes the incoming payload. |
| Normalize Slack payload | Set | Maps Slack payload into normalized fields (videoUrl) |
Receive Slack command | Extract YouTube video ID | Receives the Slack command and normalizes the incoming payload. |
| Extract YouTube video ID | Code | Extracts URL + YouTube 11-char video ID from Slack text | Normalize Slack payload | Check Video Duration | Extracts the YouTube video ID and validates video duration before processing. |
| Check Video Duration | HTTP Request | Calls YouTube Data API via RapidAPI to retrieve ISO duration | Extract YouTube video ID | Parse and validate video duration | Extracts the YouTube video ID and validates video duration before processing. |
| Parse and validate video duration | Code | Parses ISO-8601 duration and enforces 10-minute limit | Check Video Duration | Is video longer than limit? | Extracts the YouTube video ID and validates video duration before processing. |
| Is video longer than limit? | If | Branches: send Slack error vs continue processing | Parse and validate video duration | Send duration error to Slack; Convert YouTube video to MP3 | Extracts the YouTube video ID and validates video duration before processing. |
| Send duration error to Slack | HTTP Request | Posts error back to Slack via response_url |
Is video longer than limit? (true) | — | Extracts the YouTube video ID and validates video duration before processing. |
| Convert YouTube video to MP3 | HTTP Request | Downloads MP3 via RapidAPI and outputs binary mp3 |
Is video longer than limit? (false) | Create transcription job | Converts the video to audio and starts the transcription job. |
| Create transcription job | HTTP Request | Uploads MP3 binary to AssemblyAI /upload to get upload_url |
Convert YouTube video to MP3 | Submit audio for transcription | Converts the video to audio and starts the transcription job. |
| Submit audio for transcription | HTTP Request | Creates AssemblyAI transcript job from upload_url |
Create transcription job | Wait for transcription processing | Converts the video to audio and starts the transcription job. |
| Wait for transcription processing | Wait | Delays before polling again (20s) | Submit audio for transcription; Is transcription complete? (false) | Check transcription status | Waits for transcription completion and retrieves the final transcript. |
| Check transcription status | HTTP Request | Polls AssemblyAI transcript job status and retrieves text when ready | Wait for transcription processing | Extract transcript text | Waits for transcription completion and retrieves the final transcript. |
| Extract transcript text | Code | Outputs {transcript, mode} from AssemblyAI response |
Check transcription status | Is transcription complete? | Waits for transcription completion and retrieves the final transcript. |
| Is transcription complete? | If | If completed → proceed; else loop wait/poll | Extract transcript text | Generate AI summary; Wait for transcription processing | Waits for transcription completion and retrieves the final transcript. |
| Generate AI summary | OpenAI (LangChain) | Cleans/reformats transcript text (no summarization) | Is transcription complete? (true) | Post result to Slack | Formats the result and sends it back to Slack. |
| Post result to Slack | HTTP Request | Posts final transcript back to Slack channel via response_url |
Generate AI summary | — | Formats the result and sends it back to Slack. |
| Sticky Note16 | Sticky Note | Documentation (“How it works” + setup steps) | — | — | |
| Sticky Note | Sticky Note | Comment: Slack reception block | — | — | |
| Sticky Note1 | Sticky Note | Comment: YouTube extraction + duration validation | — | — | |
| Sticky Note2 | Sticky Note | Comment: conversion + transcription job start | — | — | |
| Sticky Note3 | Sticky Note | Comment: waiting + completion | — | — | |
| Sticky Note4 | Sticky Note | Comment: formatting + Slack send | — | — |
4. Reproducing the Workflow from Scratch
-
Create Webhook trigger
- Add node Webhook named
Receive Slack command. - Set HTTP Method =
POST. - Set Path =
rippr. - In Response, set a text response like:
🗡️ Ripping the full transcript… wait a few minutes, I’ll post it here soon (• v •)
- Add node Webhook named
-
Normalize Slack payload
- Add node Set named
Normalize Slack payload. - Enable Include Other Fields.
- Add field
videoUrl(String) with expression:
{{$json.body.text || ""}} - Connect:
Receive Slack command→Normalize Slack payload.
- Add node Set named
-
Extract YouTube video ID
- Add node Code named
Extract YouTube video ID. - Paste logic that:
- reads Slack text from
body.text - optionally strips
/rippit - extracts first URL
- extracts video ID using regex for watch/youtu.be/shorts/embed
- outputs
{ videoUrl, videoId, text }
- reads Slack text from
- Connect:
Normalize Slack payload→Extract YouTube video ID.
- Add node Code named
-
RapidAPI: check video duration (YouTube Data API)
- Add node HTTP Request named
Check Video Duration. - Set URL to:
https://youtube-v31.p.rapidapi.com/videos?part=contentDetails&id={{$('Extract YouTube video ID').item.json.videoId}} - Set Authentication to Generic Credential Type → HTTP Header Auth.
- Create credential RapidAPI that sends your RapidAPI key header (commonly
X-RapidAPI-Key). - Add header:
x-rapidapi-host = youtube-v31.p.rapidapi.com - Connect:
Extract YouTube video ID→Check Video Duration.
- Add node HTTP Request named
-
Parse duration + enforce max length
- Add node Code named
Parse and validate video duration. - Implement:
- read
items[0].contentDetails.duration - parse ISO
PT#H#M#S - compute total minutes
- if
> 10, output{ error: true, errorMessage, videoId, videoUrl } - else output
{ error: false, videoId, videoUrl, durationMinutes }
- read
- Connect:
Check Video Duration→Parse and validate video duration.
- Add node Code named
-
IF: duration too long
- Add node IF named
Is video longer than limit? - Condition:
{{$json.error}}equalstrue. - Connect:
Parse and validate video duration→Is video longer than limit?
- Add node IF named
-
Slack error path
- Add node HTTP Request named
Send duration error to Slack. - Method: POST
- URL:
{{$('Receive Slack command').item.json.body.response_url}} - Body: send
text = ❌ {{$json.errorMessage}} - Connect IF true →
Send duration error to Slack.
- Add node HTTP Request named
-
Convert YouTube to MP3 (RapidAPI)
- Add node HTTP Request named
Convert YouTube video to MP3. - URL:
https://youtube-mp3-audio-video-downloader.p.rapidapi.com/download-mp3/{{$json.videoId}}?quality=low - Authentication: use the same RapidAPI HTTP Header Auth credential.
- Add headers:
x-rapidapi-host = youtube-mp3-audio-video-downloader.p.rapidapi.comaccept = application/octet-stream
- Response settings:
- Response Format = File
- Binary Property =
mp3 - (Optional) “Never Error” if you want the same behavior, but note it can mask failures.
- Connect IF false →
Convert YouTube video to MP3.
- Add node HTTP Request named
-
AssemblyAI: upload binary
- Add node HTTP Request named
Create transcription job. - Method: POST
- URL:
https://api.assemblyai.com/v2/upload - Authentication: HTTP Header Auth credential named
AssemblyAI(send AssemblyAI API key, usuallyauthorizationheader). - Set body type to Binary Data, binary field =
mp3. - Add header:
content-type = application/octet-stream - Connect:
Convert YouTube video to MP3→Create transcription job.
- Add node HTTP Request named
-
AssemblyAI: create transcript job
- Add node HTTP Request named
Submit audio for transcription. - Method: POST
- URL:
https://api.assemblyai.com/v2/transcript - Authentication:
AssemblyAIcredential. - Send JSON body:
{ "audio_url": "{{$json.upload_url}}" } - Connect:
Create transcription job→Submit audio for transcription.
- Wait + Poll loop
- Add node Wait named
Wait for transcription processing, amount =20seconds. - Connect:
Submit audio for transcription→Wait for transcription processing. - Add node HTTP Request named
Check transcription status.- Method: GET
- URL:
https://api.assemblyai.com/v2/transcript/{{$node["Submit audio for transcription"].json["id"]}} - Auth:
AssemblyAI
- Connect:
Wait for transcription processing→Check transcription status.
- Extract transcript
- Add node Code named
Extract transcript text. - Output:
transcript = $json.text ?? ''and amode(optional). - Connect:
Check transcription status→Extract transcript text.
- IF: transcription complete
- Add node IF named
Is transcription complete? - Condition:
{{$node[" Check transcription status"].json.status.toLowerCase()}}equalscompleted - Connect:
Extract transcript text→Is transcription complete? - Connect IF false → back to
Wait for transcription processing(this forms the polling loop).
- OpenAI cleanup
- Add node OpenAI (LangChain) named
Generate AI summary(name optional). - Credentials: configure OpenAI API credential.
- Model:
gpt-4-turbo(or your preferred equivalent). - Messages:
- System: instructions to reformat transcript and not summarize
- User:
{{$node["Extract transcript text"].json.transcript}}
- Connect IF true →
Generate AI summary.
- Post back to Slack
- Add node HTTP Request named
Post result to Slack. - Method: POST
- URL:
{{$node["Receive Slack command"].json.body.response_url}} - Body:
response_type = in_channeltext =include branding + original video link + OpenAI output content
- Connect:
Generate AI summary→Post result to Slack.
Credentials required:
- RapidAPI (HTTP Header Auth): must include your RapidAPI key header (commonly
X-RapidAPI-Key) used by both RapidAPI endpoints. - AssemblyAI (HTTP Header Auth): typically header
authorization: <ASSEMBLYAI_API_KEY>. - OpenAI: n8n OpenAI credential.
5. General Notes & Resources
| Note Content | Context or Link |
|---|---|
| “How it works” + setup checklist is embedded in a sticky note in the workflow canvas. | Internal workflow documentation (Sticky Note16) |
| The workflow enforces a 10-minute duration limit in code, not in a parameter. | Edit Parse and validate video duration to change the limit. |
Polling loop has no max retries and does not handle AssemblyAI status=error. |
Consider adding an error branch + retry limit to avoid infinite runs. |
| The OpenAI node is named “Generate AI summary” but prompt instructs cleanup only, not summarization. | Rename node if you want clarity, or change the system prompt if you truly want summaries. |
disclaimer Le texte fourni provient exclusivement d’un workflow automatisé réalisé avec n8n, un outil d’intégration et d’automatisation. Ce traitement respecte strictement les politiques de contenu en vigueur et ne contient aucun élément illégal, offensant ou protégé. Toutes les données manipulées sont légales et publiques.