Transcribe audio to text in n8n with an HTTP Request node
Transcribe audio to text in n8n: send the recording's public URL from an HTTP Request node, loop a Wait node until the job ends, then map the text.

To transcribe audio to text in n8n, send the recording's public HTTPS URL to a speech-to-text API from an HTTP Request node, wait until the transcription job finishes, then map the transcript into the next nodes. With Sume STT 1.0, the request is POST https://api.sume.com/v1/stt-1.0/transcribe with an audio_url; a Wait node and a status check repeat until the job ends, and the result's text, words, and segments feed the rest of the workflow.
Sume has no n8n node, so this is a plain HTTPS call from n8n's own nodes. Sume facts come from the STT 1.0 schema in the Sume API reference, the OpenAPI document behind the API reference docs, and Jobs and results; n8n behavior comes from n8n's node docs. All were read on 2026-09-27. For a Sume video run that resumes a Wait node by webhook, see n8n AI video workflow.
Where does the audio file need to be?
At a public HTTPS URL that Sume can fetch. audio_url is the only required field, and the request schema has no field for file bytes, so binary data inside n8n, such as a voice message a trigger received, can't be sent as the body. Store the file where it gets a public HTTPS address, then pass that address. In current code, a URL with an explicit port or with credentials in it, or a localhost or private-network address, is refused.
How do I set up the HTTP Request node?
One HTTP Request node submits the job:
- Method
POST, URLhttps://api.sume.com/v1/stt-1.0/transcribe. - Authentication: a generic Bearer auth credential that holds your Sume API key. n8n describes Bearer auth as header auth with the Name
Authorizationand the ValueBearer <token>. Send one credential only: Sume answers401when a request carries bothAuthorization: Bearerandx-api-key. - Send Headers: an
Idempotency-Keybuilt from the file's own id. Running the node again with the same key and body returns the original job instead of billing a second one. - Send Body: JSON, Using JSON, with the body below. n8n's Import cURL option imports every value as a string, while Using JSON keeps numbers as numbers, which matters if you add
duration_seconds: an integer from 1 to 600. Leave it out and Sume reserves for 1 minute.
{
"audio_url": "{{ $json.audio_url }}",
"segmentation": { "mode": "sentence" }
}How does the workflow wait for the transcript?
The submit answers at once with the job's status_url and result_url, before any text exists. Loop until the job ends: n8n makes a loop when you connect a node's output back to an earlier node, with an If node to stop it. Cap the number of checks with {{ $runIndex }}, n8n's zero-based count of a node's runs, as n8n Google Sheets AI avatar video shows.
| Node | Setting | Why |
|---|---|---|
| Wait | After Time Interval, a few seconds | Gives the job time between checks. Under 65 seconds, n8n keeps the execution running instead of offloading it to the database. |
| HTTP Request | GET {{ $json.data.status_url }}, same credential | The submit response and every status response carry data.status_url. |
| If | Boolean: {{ $json.data.terminal }} is true | terminal turns true once the job is completed, failed, or canceled. Connect the false output back to Wait. |
| HTTP Request | GET {{ $json.data.result_url }}, same credential | Returns the transcript under data.result once the job is completed. |
How do I use the transcript in the next nodes?
The last HTTP Request node outputs the result under data.result. Map its fields with expressions:
{{ $json.data.result.text }}: the whole transcript.{{ $json.data.result.words }}: every token withword,start, andend, in seconds from the start of the audio. An entry can carry atype, such aswordorspacing.{{ $json.data.result.segments }}: with sentence segmentation, one entry per sentence withindex,text,start,end, andduration_seconds.{{ $json.data.result.language_code }}: the detected or requested language, when available.- For many recordings, send one item per file. n8n nodes usually run once for each item, so the submit node starts one job per recording; Batch transcription API covers many files at once.
What if the job fails, or the recording is long?
STT 1.0 costs $0.01 per audio minute, plus a 5.5% agent fee by default. A few rules keep the workflow from paying twice or stalling:
- A failed or canceled job has no result:
/resultanswers409 job_not_completed. By default the HTTP Request node returns success only for a 2xx response, so that 409 makes the result node fail. Branch ondata.sume_statusbefore it, and read the reason fromGET /v1/jobs/{id}. - Don't resubmit because a check timed out. The job keeps running and still bills, and the same
Idempotency-Keywith the same body returns the original job. - One request covers up to 10 minutes of audio. Split longer recordings first: Transcribe long audio files.
- No speaker labels:
diarizeis fixed server-side and runs off in current code.
Sources
- Sume API reference
- API reference
- Jobs and results
- Authentication
- API pricing
- n8n Docs: HTTP Request node (read 2026-09-27)
- n8n Docs: HTTP Request credentials (read 2026-09-27)
- n8n Docs: Wait node (read 2026-09-27)
- n8n Docs: If node (read 2026-09-27)
- n8n Docs: Looping (read 2026-09-27)
- n8n Docs: n8n metadata (read 2026-09-27)
- n8n Docs: Loop Over Items (read 2026-09-27)
Related posts
More in Integrations
- Trigger.dev wait for webhook: waitpoint tokens for Sume runs
Create a Trigger.dev waitpoint token, send token.url as a Sume run's webhook_url, and wait.forToken() returns when Sume POSTs the run's result.
- How to upload a file to an S3 bucket from a URL in Python
Stream the URL's response straight into boto3's upload_fileobj, with no temp file. For a generated video, copy on the webhook and check the bytes.
- Vercel AI SDK: generate video with a Sume API tool call
Generate video from the Vercel AI SDK with a tool() that calls Sume's POST /v1/videos on your server, returns the job id, and polls for the clip.
- Vercel Cron Jobs: call the Sume API daily without duplicates
A Vercel cron job sends a GET to your route, which calls the Sume API with a date-based Idempotency-Key, so a duplicate invocation cannot bill twice.
Written by Sume