Reference · Tools

AssemblyAI

Transcribe audio, analyze content, and interact with LLM gateway using AssemblyAI API.

Action (binary) Utility v1 Binary data

The AssemblyAI node connects BusyBot to the AssemblyAI REST API to transcribe audio files and extract structured insights — sentiment scores, named entities, auto-generated chapters, and more. You could, for example, build a workflow that ingests recorded sales calls, transcribes them, flags negative sentiment, and posts a summary to Slack. It also exposes AssemblyAI's LLM gateway for chat completions alongside the transcription pipeline.

Node type
Action (binary)
Parameters
20
Outputs
Output, Error
Credentials
AssemblyAI API

AssemblyAI

Transcribe audio, analyze content, and interact with LLM gateway using AssemblyAI

Overview

The AssemblyAI tool provides comprehensive speech-to-text transcription, audio intelligence features (sentiment analysis, entity detection, auto chapters, content safety, PII redaction, summarization), and an LLM gateway for chat completions and understanding. It supports async transcript creation with built-in polling, file upload for audio binary data, subtitle export (SRT/VTT), redacted audio download, word search, and paragraph/sentence segmentation. Uses the AssemblyAI REST API v2 with API key authentication.

Category: Utility
Tool Name: assemblyai
Version: 1

Appearance: Icon: lucide-Headphones | Color: #2545D3

Node Type

Action (Binary) — handles file/binary data operations

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires AssemblyAI API credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Filefile
Transcripttranscript
LLM GatewayllmGateway

Operations

Every operation belongs to one resource: File offers Upload, Transcript offers the nine transcript operations, and LLM Gateway offers Chat Completions and Understanding.

OperationValueDescription
UploaduploadUpload a binary audio file to AssemblyAI
CreatecreateCreate a new transcript from an audio URL
GetgetGet a transcript by ID
ListlistList all transcripts
DeletedeleteDelete a transcript by ID
Get ParagraphsgetParagraphsGet transcript split into paragraphs
Get SentencesgetSentencesGet transcript split into sentences
Get SubtitlesgetSubtitlesExport transcript as SRT or VTT subtitles
Get Redacted AudiogetRedactedAudioDownload the redacted version of the audio
Word SearchwordSearchSearch for words in a transcript
Chat CompletionschatCompletionsSend chat messages through the LLM gateway
UnderstandingunderstandingUse the understanding endpoint for audio analysis

Parameters

File: Upload

ParameterTypeRequiredDefaultDescription
Binary PropertystringNodataName of the binary property containing the audio file to upload. Names are case-sensitive — see the upstream node’s Binary Data panel for the exact names to use. Supports expressions.

Transcript: Create

ParameterTypeRequiredDefaultDescription
Audio URLstringYesURL of the audio file to transcribe. Can be a public URL or an AssemblyAI upload URL. Supports expressions.
Wait for CompletionbooleanNotrueWhether to poll and wait until the transcript is completed before returning.
Polling Interval (ms)numberNo3000Milliseconds between polling attempts when waiting for transcript completion. (shown when Wait for Completion is true)
Max Polling AttemptsnumberNo60Maximum number of polling attempts before timing out. (shown when Wait for Completion is true)
Transcript OptionscollectionNo{}Additional options for transcript creation.
— Speech ModeloptionsNobestThe speech recognition model to use.
Options: best (highest accuracy model), nano (faster, lower-cost model)
— Language CodestringNoenThe language code of the audio (e.g., en, es, fr, de).
— Language DetectionbooleanNofalseWhether to automatically detect the language of the audio.
— Speaker LabelsbooleanNofalseWhether to enable speaker diarization.
— Speakers ExpectednumberNo0Expected number of speakers. Set to 0 for automatic detection.
— PunctuatebooleanNotrueWhether to add punctuation to the transcript.
— Format TextbooleanNotrueWhether to format text (e.g., numbers, dates).
— Sentiment AnalysisbooleanNofalseWhether to enable sentiment analysis on each sentence.
— Entity DetectionbooleanNofalseWhether to detect entities (people, places, organizations, etc.).
— Auto ChaptersbooleanNofalseWhether to automatically generate chapters with summaries.
— Auto HighlightsbooleanNofalseWhether to automatically detect key phrases and highlights.
— Content SafetybooleanNofalseWhether to detect sensitive content topics.
— Redact PIIbooleanNofalseWhether to redact personally identifiable information from the transcript.
— Redact PII PoliciesstringNoComma-separated PII policies to redact (e.g., medical_process, phone_number, email_address, credit_card_number, ssn, date_of_birth, person_name).
— SummarizationbooleanNofalseWhether to generate a summary of the transcript.
— Summary ModeloptionsNoinformativeThe summarization model to use.
Options: informative (best for informational content), conversational (best for conversational audio), catchy (best for catchy, engaging summaries)
— Summary TypeoptionsNobulletsThe type of summary to generate.
Options: bullets (concise bullet points), bullets_verbose (detailed bullet points), gist (brief one-line summary), headline (headline-style summary), paragraph (full paragraph summary)
— Webhook URLstringNoURL to receive a webhook notification when transcription is complete.
— Webhook Auth Header NamestringNoName of the authentication header for the webhook.
— Webhook Auth Header ValuestringNoValue of the authentication header for the webhook.
— Dual ChannelbooleanNofalseWhether the audio is dual-channel (stereo) with separate speakers per channel.
— Filter ProfanitybooleanNofalseWhether to filter profanity from the transcript text.
— Word BooststringNoComma-separated words or phrases to boost recognition accuracy for.

Transcript: Get

ParameterTypeRequiredDefaultDescription
Transcript IDstringYesThe ID of the transcript. Supports expressions.

Transcript: List

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all transcripts using cursor pagination.
LimitnumberNo20Maximum number of transcripts to return. (shown when Return All is false)

Transcript: Delete

ParameterTypeRequiredDefaultDescription
Transcript IDstringYesThe ID of the transcript. Supports expressions.

Transcript: Get Paragraphs

ParameterTypeRequiredDefaultDescription
Transcript IDstringYesThe ID of the transcript. Supports expressions.

Transcript: Get Sentences

ParameterTypeRequiredDefaultDescription
Transcript IDstringYesThe ID of the transcript. Supports expressions.

Transcript: Get Subtitles

ParameterTypeRequiredDefaultDescription
Transcript IDstringYesThe ID of the transcript. Supports expressions.
Subtitle FormatoptionsNosrtThe subtitle format to export.
Options: srt, vtt

Transcript: Get Redacted Audio

ParameterTypeRequiredDefaultDescription
Transcript IDstringYesThe ID of the transcript. Supports expressions.
Output Binary PropertystringNodataName of the binary property to store the redacted audio file.
Output FilenamestringNoredacted_audio.wavFilename for the downloaded redacted audio file.
ParameterTypeRequiredDefaultDescription
Transcript IDstringYesThe ID of the transcript. Supports expressions.
Search WordsstringYesComma-separated list of words to search for in the transcript. Supports expressions.

LLM Gateway: Chat Completions

ParameterTypeRequiredDefaultDescription
Chat MessagesstringNoJSON array of chat messages (e.g., [{“role”: “user”, “content”: “Summarize this transcript”}]). Supports expressions.
Chat ModelstringNoanthropic/claude-3-5-sonnetThe LLM model to use for chat completions (e.g., anthropic/claude-3-5-sonnet).
Transcript IDsstringNoComma-separated transcript IDs to provide as context for the LLM chat. Supports expressions.

LLM Gateway: Understanding

ParameterTypeRequiredDefaultDescription
Understanding InputstringNoJSON input for the understanding endpoint. Supports expressions.

All Operations

ParameterTypeRequiredDefaultDescription
Max ConcurrencynumberNo5Maximum number of items to process concurrently.

Output Data

One output item per input item. The AssemblyAI response is merged into the item JSON at the top level — its fields sit alongside the fields already on the item, and any field of the same name is overwritten. Binary data from the input item is forwarded unchanged; Get Redacted Audio additionally attaches the downloaded audio as a new binary property.

OperationWhat lands on the item
UploadThe upload response, including the upload_url you hand to Create.
CreateThe transcript object — id, status, the full transcript text with word timestamps, and whichever intelligence results you enabled (speaker labels, sentiment scores, detected entities, chapters, highlights, content safety, summary). With Wait for Completion off the node returns immediately and status is still queued or processing.
GetThe same transcript object, fetched by ID.
Listtranscripts (the array of transcript records) plus the API’s own pagination details. With Return All on, every page is fetched and the item carries transcripts and total_count instead.
DeleteThe deletion response for that transcript.
Get ParagraphsThe transcript split into paragraphs, as returned by AssemblyAI.
Get SentencesThe transcript split into sentences, as returned by AssemblyAI.
Get Subtitlestext — the whole SRT or VTT document as a single string — and format (srt or vtt).
Get Redacted Audioredacted_audio_url and status, plus the downloaded audio file stored under the Output Binary Property.
Word SearchThe word-search response for the words you supplied.
Chat CompletionsThe LLM gateway chat response.
UnderstandingThe understanding endpoint response.

Reference the result downstream by expression, e.g. {{ $json.upload_url }} after Upload or {{ $json.id }} after Create.

Usage Examples

  • Transcribe an audio file from a URL with speaker labels
  • Upload binary audio data and get a transcription URL
  • Get transcript paragraphs and sentences for formatting
  • Export subtitles in SRT or VTT format
  • Download redacted audio with PII removed
  • Search for specific words in a transcript
  • Use LLM gateway for chat completions with transcript context
  • Analyze audio for sentiment, entities, and content safety

Example Configuration

Upload an audio file:

{
  "resource": "file",
  "operation": "upload",
  "binaryPropertyName": "data",
  "maxConcurrency": 5
}

Create a transcript without waiting for it to finish:

{
  "resource": "transcript",
  "operation": "create",
  "audioUrl": "https://example.com/audio/interview.mp3",
  "waitForCompletion": false,
  "maxConcurrency": 5
}

Create a transcript and wait for the result:

{
  "resource": "transcript",
  "operation": "create",
  "audioUrl": "https://example.com/audio/interview.mp3",
  "waitForCompletion": true,
  "pollingInterval": 3000,
  "maxPollingAttempts": 60,
  "maxConcurrency": 5
}

Create a transcript with advanced options:

{
  "resource": "transcript",
  "operation": "create",
  "audioUrl": "https://storage.example.com/podcast.mp3",
  "waitForCompletion": true,
  "pollingInterval": 5000,
  "maxPollingAttempts": 30,
  "transcriptOptions": {
    "speech_model": "best",
    "language_code": "en",
    "language_detection": false,
    "speaker_labels": true,
    "speakers_expected": 2,
    "punctuate": true,
    "format_text": true,
    "sentiment_analysis": false,
    "entity_detection": true,
    "auto_chapters": false,
    "auto_highlights": true,
    "content_safety": false,
    "redact_pii": false,
    "redact_pii_policies": "",
    "summarization": false,
    "summary_model": "informative",
    "summary_type": "bullets",
    "webhook_url": "",
    "webhook_auth_header_name": "",
    "webhook_auth_header_value": "",
    "dual_channel": false,
    "filter_profanity": false,
    "word_boost": ""
  },
  "maxConcurrency": 5
}

Create a transcript with PII redaction and summarization:

{
  "resource": "transcript",
  "operation": "create",
  "audioUrl": "https://cdn.example.com/call-recording.wav",
  "waitForCompletion": true,
  "pollingInterval": 4000,
  "maxPollingAttempts": 50,
  "transcriptOptions": {
    "speech_model": "best",
    "language_code": "en",
    "language_detection": false,
    "speaker_labels": false,
    "speakers_expected": 0,
    "punctuate": true,
    "format_text": true,
    "sentiment_analysis": true,
    "entity_detection": false,
    "auto_chapters": false,
    "auto_highlights": false,
    "content_safety": false,
    "redact_pii": true,
    "redact_pii_policies": "person_name,phone_number,email_address",
    "summarization": true,
    "summary_model": "informative",
    "summary_type": "bullets",
    "webhook_url": "",
    "webhook_auth_header_name": "",
    "webhook_auth_header_value": "",
    "dual_channel": false,
    "filter_profanity": true,
    "word_boost": ""
  },
  "maxConcurrency": 3
}

Get a transcript by ID:

{
  "resource": "transcript",
  "operation": "get",
  "transcriptId": "abc123xyz",
  "maxConcurrency": 5
}

Delete a transcript:

{
  "resource": "transcript",
  "operation": "delete",
  "transcriptId": "abc123xyz",
  "maxConcurrency": 5
}

Get paragraphs:

{
  "resource": "transcript",
  "operation": "getParagraphs",
  "transcriptId": "abc123xyz",
  "maxConcurrency": 5
}

Get sentences:

{
  "resource": "transcript",
  "operation": "getSentences",
  "transcriptId": "abc123xyz",
  "maxConcurrency": 5
}

Export subtitles as SRT:

{
  "resource": "transcript",
  "operation": "getSubtitles",
  "transcriptId": "abc123xyz",
  "subtitleFormat": "srt",
  "maxConcurrency": 5
}

Export subtitles as VTT:

{
  "resource": "transcript",
  "operation": "getSubtitles",
  "transcriptId": "abc123xyz",
  "subtitleFormat": "vtt",
  "maxConcurrency": 5
}

Download redacted audio:

{
  "resource": "transcript",
  "operation": "getRedactedAudio",
  "transcriptId": "abc123xyz",
  "outputBinaryPropertyName": "redactedAudio",
  "outputFilename": "redacted_output.mp3",
  "maxConcurrency": 5
}

Search a transcript for words:

{
  "resource": "transcript",
  "operation": "wordSearch",
  "transcriptId": "abc123xyz",
  "searchWords": "contract,payment,deadline",
  "maxConcurrency": 5
}

List transcripts up to a limit:

{
  "resource": "transcript",
  "operation": "list",
  "returnAll": false,
  "limit": 25,
  "maxConcurrency": 5
}

List every transcript, paginating automatically:

{
  "resource": "transcript",
  "operation": "list",
  "returnAll": true,
  "maxConcurrency": 5
}

Leave limit out when Return All is on — it only applies when Return All is off.

Send chat messages through the LLM gateway with transcript context:

{
  "resource": "llmGateway",
  "operation": "chatCompletions",
  "chatMessages": "[{\"role\": \"user\", \"content\": \"Summarize the key decisions from this meeting transcript.\"}]",
  "chatModel": "anthropic/claude-3-5-sonnet",
  "chatTranscriptIds": "abc123xyz,def456uvw",
  "maxConcurrency": 5
}

Send chat messages without transcript context:

{
  "resource": "llmGateway",
  "operation": "chatCompletions",
  "chatMessages": "[{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"}, {\"role\": \"user\", \"content\": \"What are best practices for meeting notes?\"}]",
  "chatModel": "openai/gpt-4o",
  "chatTranscriptIds": "",
  "maxConcurrency": 5
}

Call the understanding endpoint:

{
  "resource": "llmGateway",
  "operation": "understanding",
  "understandingInput": "{\"audio_url\": \"https://example.com/audio.mp3\", \"questions\": [{\"question\": \"What is the main topic?\", \"answer_format\": \"brief\"}]}",
  "maxConcurrency": 5
}

Upload, then transcribe (two nodes)

Upload a local binary audio file first, then use the returned upload URL to create the transcript.

Step 1 — upload node:

{
  "resource": "file",
  "operation": "upload",
  "binaryPropertyName": "data",
  "maxConcurrency": 5
}

Step 2 — create transcript node, reading upload_url from step 1:

{
  "resource": "transcript",
  "operation": "create",
  "audioUrl": "={{$json.upload_url}}",
  "waitForCompletion": true,
  "pollingInterval": 3000,
  "maxPollingAttempts": 60,
  "transcriptOptions": {
    "speech_model": "best",
    "language_code": "en",
    "language_detection": false,
    "speaker_labels": false,
    "speakers_expected": 0,
    "punctuate": true,
    "format_text": true,
    "sentiment_analysis": false,
    "entity_detection": false,
    "auto_chapters": false,
    "auto_highlights": false,
    "content_safety": false,
    "redact_pii": false,
    "redact_pii_policies": "",
    "summarization": false,
    "summary_model": "informative",
    "summary_type": "bullets",
    "webhook_url": "",
    "webhook_auth_header_name": "",
    "webhook_auth_header_value": "",
    "dual_channel": false,
    "filter_profanity": false,
    "word_boost": ""
  },
  "maxConcurrency": 5
}

Transcribe a public URL with speaker labels

{
  "resource": "transcript",
  "operation": "create",
  "audioUrl": "https://cdn.example.com/webinar-recording.mp4",
  "waitForCompletion": true,
  "pollingInterval": 5000,
  "maxPollingAttempts": 120,
  "transcriptOptions": {
    "speech_model": "best",
    "language_code": "en",
    "language_detection": false,
    "speaker_labels": true,
    "speakers_expected": 3,
    "punctuate": true,
    "format_text": true,
    "sentiment_analysis": false,
    "entity_detection": false,
    "auto_chapters": true,
    "auto_highlights": false,
    "content_safety": false,
    "redact_pii": false,
    "redact_pii_policies": "",
    "summarization": true,
    "summary_model": "informative",
    "summary_type": "bullets",
    "webhook_url": "",
    "webhook_auth_header_name": "",
    "webhook_auth_header_value": "",
    "dual_channel": false,
    "filter_profanity": false,
    "word_boost": "Q3,roadmap,milestone"
  },
  "maxConcurrency": 3
}

Transcribe, redact PII, then download the redacted audio

Step 1 — create the redacted transcript:

{
  "resource": "transcript",
  "operation": "create",
  "audioUrl": "https://example.com/sensitive-call.mp3",
  "waitForCompletion": true,
  "pollingInterval": 4000,
  "maxPollingAttempts": 60,
  "transcriptOptions": {
    "speech_model": "best",
    "language_code": "en",
    "language_detection": false,
    "speaker_labels": false,
    "speakers_expected": 0,
    "punctuate": true,
    "format_text": true,
    "sentiment_analysis": false,
    "entity_detection": false,
    "auto_chapters": false,
    "auto_highlights": false,
    "content_safety": false,
    "redact_pii": true,
    "redact_pii_policies": "person_name,phone_number,email_address,ssn",
    "summarization": false,
    "summary_model": "informative",
    "summary_type": "bullets",
    "webhook_url": "",
    "webhook_auth_header_name": "",
    "webhook_auth_header_value": "",
    "dual_channel": false,
    "filter_profanity": false,
    "word_boost": ""
  },
  "maxConcurrency": 5
}

Step 2 — download the redacted audio:

{
  "resource": "transcript",
  "operation": "getRedactedAudio",
  "transcriptId": "={{$json.id}}",
  "outputBinaryPropertyName": "redactedAudio",
  "outputFilename": "redacted_call.mp3",
  "maxConcurrency": 5
}

Analyze a transcript with the LLM gateway

Step 1 — get the transcript:

{
  "resource": "transcript",
  "operation": "get",
  "transcriptId": "abc123xyz",
  "maxConcurrency": 5
}

Step 2 — chat completions using that transcript as context:

{
  "resource": "llmGateway",
  "operation": "chatCompletions",
  "chatMessages": "[{\"role\": \"user\", \"content\": \"Extract all action items and assigned owners from this transcript.\"}]",
  "chatModel": "anthropic/claude-3-5-sonnet",
  "chatTranscriptIds": "abc123xyz",
  "maxConcurrency": 5
}

Search for keywords across a transcript

{
  "resource": "transcript",
  "operation": "wordSearch",
  "transcriptId": "abc123xyz",
  "searchWords": "budget,approval,Q4,launch",
  "maxConcurrency": 5
}

Error Handling

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes failed items to Error output port

Tips

AssemblyAI transcribes audio via speech-to-text and applies intelligence features including sentiment analysis, entity detection, PII redaction, content safety, and auto-chapter generation. Use it when a workflow needs to convert audio recordings into structured text or extract insights like sentiment, named entities, or topic summaries from spoken content. It outputs a transcript with full text, word timestamps, paragraph and sentence segments, detected entities, sentiment scores, and optional SRT or VTT subtitle files.

Key Rules and Gotchas

  1. transcriptOptions is a flat collection object. Never wrap it in _default or an array. All sub-fields sit directly under the transcriptOptions key.

  2. waitForCompletion defaults to true, so create blocks while it polls. A long recording can hold the node open for pollingInterval × maxPollingAttempts (3 minutes at the defaults of 3000 ms × 60). Set waitForCompletion: false for fire-and-forget creates, and raise maxPollingAttempts for long audio. pollingInterval and maxPollingAttempts only apply when waitForCompletion is true and operation is "create" — do not include them in other contexts.

  3. limit is only valid when returnAll is false on the list operation. When returnAll is true, omit limit.

  4. chatMessages must be a JSON-serialized string, not a raw JSON object. Escape inner quotes appropriately.

  5. transcriptId is shared across multiple operations (get, delete, getParagraphs, getSentences, getSubtitles, getRedactedAudio, wordSearch) — always required for single-transcript operations other than create.

  6. resource and operation must be consistent. For example, "upload" belongs to resource: "file", transcript CRUD operations belong to resource: "transcript", and "chatCompletions" / "understanding" belong to resource: "llmGateway".

Frequently asked questions

What credentials do I need, and how do I add them?

You need an AssemblyAI API key, configured as an AssemblyAI API credential (type `assemblyaiApi`) in BusyBot. Obtain the key from your AssemblyAI dashboard and paste it into the credential form. Every request the node makes is authenticated with that key — there is no OAuth flow.

My transcription job is timing out. How do I handle long audio files?

By default, `waitForCompletion` is `true`, which makes the node poll until the transcript is ready. At the default settings (3000 ms interval × 60 attempts), the node will wait up to 3 minutes before giving up. For longer recordings, increase `maxPollingAttempts` to give the job more time. Alternatively, set `waitForCompletion: false` to submit the job and retrieve the result later using the `get` operation with the returned `transcriptId`.

How do I pass options like sentiment analysis or PII redaction when creating a transcript?

All transcription options — including sentiment analysis, entity detection, content safety, PII redaction, and auto chapters — go directly under the `transcriptOptions` key as a flat object. Do not nest them inside a `_default` key or an array. For example, set `transcriptOptions.sentiment_analysis: true` alongside your audio URL at the same level.

How do I send messages to the LLM gateway, and why does my request keep failing?

The LLM gateway operations (`chatCompletions` and `understanding`) require `resource` to be set to `llmGateway`. The `chatMessages` parameter must be a JSON-serialized string — not a raw object or array. If you're constructing the message list dynamically, serialize it to a string and escape inner quotes before passing it to the node.

Can I retrieve subtitles, redacted audio, or word-level search results from an existing transcript?

Yes. The operations `getSubtitles` (SRT or VTT format), `getRedactedAudio`, `getParagraphs`, `getSentences`, and `wordSearch` all work on an already-completed transcript. Every one of these operations requires a `transcriptId`, which is returned when you create a transcript. Make sure `resource` is set to `transcript` for all of them.

Build with the AssemblyAI node

Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need AssemblyAI API credentials first.

Open BusyBot

Last updated . Spotted something wrong? Tell us.