2026-10-05 · 4 min read

Caption videos in n8n with plain HTTP Request nodes

n8n is a common way to chain video tools together: generate a clip, caption it, post it. You do not need a community node for the caption step. The caption.sh API is three HTTP calls, and n8n's HTTP Request node covers all of them.

The workflow

  • HTTP Request, POST https://api.caption.sh/v1/videos. Send the video URL and options as JSON. The response is a 202 with a job_id.
  • Wait, then HTTP Request, GET https://api.caption.sh/v1/jobs/{{ $json.job_id }}. Loop back to the Wait node through an IF node until status is done. Branch to an error path if status is error.
  • HTTP Request, GET https://api.caption.sh/v1/jobs/{{ $json.job_id }}/result, with the response format set to File. The binary output is the captioned MP4, ready for your next node.

Authentication

Create an API key in the caption.sh dashboard. In n8n, add a Header Auth credential with the name Authorization and the value Bearer followed by your key, and attach it to all three nodes. Keeping it in a credential means the key never sits in the workflow JSON you export or share.

The submit body

{
  "source_url": "{{ $json.video_url }}",
  "options": { "max_words": 3 }
}

The video has to be reachable by URL. If your earlier node produced a file instead, use the upload flow: the submit call returns a signed upload URL, you PUT the bytes to it, and the job starts when the upload finishes. max_words sets how many words show at once. 3 is a good default for short-form clips.

Polling without hammering the API

A Wait node set to five seconds is enough. Captioning runs on our side and takes a while on longer clips, so cap the loop, for example 60 passes, and send anything past that to an error branch. A 402 on the submit means the prepaid balance is empty, and a 422 means the input was rejected, so neither is worth retrying.

When this is the wrong tool

caption.sh burns captions into the video. It does not export SRT or VTT sidecar files. If a later step needs a transcript file, get it from a transcription node and use caption.sh for the version people watch on a feed.

Try it

Judge the output in the playground at caption.sh first, then build the three nodes above. The reference is at caption.sh/docs and the OpenAPI spec is at api.caption.sh/openapi.json.

Back to all articles