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.

6 min readSume
All posts

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, URL https://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 Authorization and the Value Bearer <token>. Send one credential only: Sume answers 401 when a request carries both Authorization: Bearer and x-api-key.
  • Send Headers: an Idempotency-Key built 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.

From n8n's Wait node, If node, and Looping docs and Sume's Jobs and results, read 2026-09-27.
NodeSettingWhy
WaitAfter Time Interval, a few secondsGives the job time between checks. Under 65 seconds, n8n keeps the execution running instead of offloading it to the database.
HTTP RequestGET {{ $json.data.status_url }}, same credentialThe submit response and every status response carry data.status_url.
IfBoolean: {{ $json.data.terminal }} is trueterminal turns true once the job is completed, failed, or canceled. Connect the false output back to Wait.
HTTP RequestGET {{ $json.data.result_url }}, same credentialReturns 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 with word, start, and end, in seconds from the start of the audio. An entry can carry a type, such as word or spacing.
  • {{ $json.data.result.segments }}: with sentence segmentation, one entry per sentence with index, text, start, end, and duration_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: /result answers 409 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 on data.sume_status before it, and read the reason from GET /v1/jobs/{id}.
  • Don't resubmit because a check timed out. The job keeps running and still bills, and the same Idempotency-Key with 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: diarize is fixed server-side and runs off in current code.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume