npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@mobiuscode/n8n-nodes-videoapi

v1.2.1

Published

n8n community nodes that easily integrate VideoAPI Workflows in your n8n projects

Downloads

411

Readme

n8n-nodes-videoapi

An n8n community node for Video API — AI-powered video and audio processing.

A single Video API node exposes the whole service, organized by Resource (Video, Audio, Render, File, Job) and Operation. Every operation is also searchable by name in the n8n nodes panel.

Installation

In n8n (recommended): Settings → Community Nodes → Install → @mobiuscode/n8n-nodes-videoapi. See the community node install guide.

Manual / self-hosted: install the package into your n8n custom folder:

cd ~/.n8n/nodes        # create it if it doesn't exist
npm install @mobiuscode/n8n-nodes-videoapi

Credentials

Get an API key from video-api.io, then create Video API credentials in n8n:

  • API Key — sent as the x-api-key header.
  • Base URL — defaults to https://api.video-api.io; change it only for a self-hosted/local instance.

n8n validates the key when you save the credential.

How jobs work

Most media operations create an asynchronous job. Every job-creating operation shares a Job Options group:

| Option | Default | Description | |--------|---------|-------------| | Wait for Completion | true | Poll the job until it finishes and return the completed job JSON (its result field is the output file ID). Turn off to return the raw JobResponse (with the job id) and poll yourself with Job → Get. | | Download Result as Binary | false | Also download the result file and attach it as binary (data). Off by default — fetch the file anytime with File → Download instead. Only applies while Wait for Completion is on. | | Create as Draft | false | Create the job without queueing it. Run it later with Job → Queue. (Draft implies "don't wait".) | | Polling Interval (Ms) | 2000 | How often to check job status while waiting. | | Timeout (Ms) | 1800000 | Maximum time to wait for completion (default 30 min). |

A job's output is a file ID (result). To chain operations, pass that ID into the next operation's file input — the file stays on Video API's servers (upload once, download once at the end).

Operations

Video

The three AI operations are self-contained: their Input Mode accepts File IDs, Binary (auto-uploaded), or a URL (auto-pulled), so a single node can take a source and return a finished video. The URL/Pull download must point to a direct media file — a YouTube or web-page URL won't work, and only download content you have the rights to.

| Operation | Description | |-----------|-------------| | AI Cut | Create a new video by AI-cutting sequences from one or more videos, guided by a prompt. | | AI Sequence Extraction | Extract video sequences from a video by prompt. | | AI Social Media Compose | Compose a social-media video with AI voice-over, music and subtitles. | | Caption | Burn given subtitle text into a video. | | Cut | Cut and merge specific video sequences. | | Extract Audio | Extract the audio track from a video. | | Generate Preview | Generate preview images from a video. | | Get Info | Get video metadata (resolution, duration, FPS…). | | Mix In Audio | Mix an audio file into a video (kept alongside existing audio). | | Overlay | Overlay videos/images over a background video. | | Replace Audio | Replace a video's audio with a given audio file. | | Subtitles | Generate and render subtitles into a video. | | Transcode | Transcode a video to a different format/resolution. |

Non-AI operations take file IDs directly — get one with File → Upload or File → Pull first.

Audio

| Operation | Description | |-----------|-------------| | Generate From Script | Text-to-speech voice-over from a script (30 voices). | | Get Info | Get audio metadata (duration). | | Transcode | Convert audio to FLAC / AAC / AAC HQ / MP3. |

Render

| Operation | Description | |-----------|-------------| | Subtitles | Render subtitles for an audio or video file (WebM or ZIP). |

File

| Operation | Description | |-----------|-------------| | Upload | Upload binary data; returns the file id. | | Pull | Download a direct media URL into Video API; returns the resulting file id. | | Download | Download a stored file by ID as binary. | | Download Zip | Download multiple files (comma-separated IDs) as a ZIP. | | Get Metadata | Get metadata for a stored file. | | Get Download Token | Get a short-lived download token. | | Delete | Permanently delete a stored file. |

Job

| Operation | Description | |-----------|-------------| | Get | Get all information about a job. | | List | List jobs (with page/size/status filters). | | Queue | Transition a DRAFT job to SCHEDULED. | | Delete Draft | Delete a DRAFT job. |

Example workflows

The examples/ folder has ready-to-import workflows for the AI operations. Each is a single Video API node (Input Mode = URL, Wait for Completion = on, Download Result as Binary = on) that returns the finished file as binary (data) — import one, select your Video API credential, and run:

For long videos, swap Wait-on for the poll-loop in Tips & gotchas below.

Tips & gotchas

Chaining file IDs

The ID fields default to ={{ $json.result }}, which grabs the file ID from the previous node automatically. Where the ID lives depends on the upstream node:

  • After a job (AI Cut, Transcode, Pull…) or Job → Get → it's in result. Its id is the job ID, not the file.
  • After File → Upload or Get Metadata → it's in id (no result). Use ={{ $json.id }} there.
  • After File → Download → it's in fileId.

Override the field anytime; the default is just a convenience for the common case.

Operations with two inputs (Replace Audio, Mix In Audio, Overlay)

These need two different files (e.g. a video and an audio). $json only refers to the one node immediately before, so the auto-default can only fill one field correctly — if you leave both on the default they'd point at the same file.

Set the second input from its own source using a named-node reference:

Replace Audio
  Video File ID  = {{ $('Pull Video').item.json.result }}
  Audio File ID  = {{ $('Generate From Script').item.json.result }}

(Use .id instead of .result when the referenced node is a File → Upload.)

Get Info doesn't return an ID

Get Info outputs only metadata (no id/result), so it breaks an ID chain. Put it on a side branch off the node whose file you want to inspect, not in the middle of the chain.

Long-running jobs / large videos

Wait for Completion = on blocks the node until the job finishes (capped by the Timeout, default 30 min) and ties up an n8n worker. For big AI renders, use fire-and-forget + a poll loop instead:

File: Pull/Upload → AI Cut (Input Mode = File IDs, Wait OFF) → Job: Get ◄─────┐
                                                                  │           │
                                                                  ▼           │
                                                          IF status==DONE?    │
                                                          ┌──┴──┐             │
                                                       true│     │false        │
                                                          ▼     ▼             │
                                                  File: Download  Wait 30s ────┘
  • AI Cut → Wait OFF returns the job (id) immediately, no blocking, no binary.
  • Job → Get (Job ID = {{ $json.id }}) → IF ({{ $json.status }} == DONE) → on false a Wait node (15–30 s) loops back to Job → Get.
  • On true, File → Download ({{ $json.result }}) fetches the finished video.
  • Pre-resolve the source to a file ID (Pull/Upload) and feed AI Cut via Input Mode = File IDs — then nothing inside the AI node blocks (URL/Binary modes still pull/upload the source synchronously first).
  • Robustness: also branch on {{ $json.errorReason }} != NONE so a failed job doesn't loop forever, and optionally stop after N polls.

Other notes

  • Binary output is opt-in — jobs return JSON by default (the file ID is in result). Turn on Download Result as Binary to also get the file as data, or fetch it anytime with File → Download.
  • Create as Draft = on doesn't queue the job, so the node won't wait — run it later with Job → Queue.

Credits

Operations consume credits from your Video API account (e.g. AI Cut: 1 credit per 60 s of input; voice generation: 1 credit per 1000 tokens). The returned JobResponse includes estimatedCosts and paidCredits.

Development

git clone https://github.com/mobiuscode-com/n8n-nodes-videoapi.git
cd n8n-nodes-videoapi
npm install
npm run build          # tsc + copies icons into dist/

To test against a local n8n, point n8n at the build output and start it:

export N8N_CUSTOM_EXTENSIONS="$(pwd)/dist"
n8n start              # http://localhost:5678

Rebuild and restart n8n after changes. Source lives in nodes/ and credentials/; dist/ is generated.

Releases

Publishing is automated with semantic-release: every push to main derives the next version from the commit messages (Conventional Commits), tags it, creates a GitHub release and publishes to npm.

  • fix: … → patch release (1.0.0 → 1.0.1)
  • feat: … → minor release (1.0.0 → 1.1.0)
  • feat!: … or BREAKING CHANGE: footer → major release (→ 2.0.0)
  • chore: …, docs: …, … → no release

License

MIT

Resources