Add a password
Protect a video or playlist with a password. Change it when access needs to change.
Features
Client previews, lessons or team updates. Share each video with the access settings you need.
How it worksProtect a video or playlist with a password. Change it when access needs to change.
Give members of a saved audience their own access links.
Set which websites may embed your videos.
How it works
Add a video file or capture your screen or camera in your browser.
Choose a cover, add chapters and set who can watch.
Send the link or copy the embed code for your website.
Built for your workflow
From the first recording to the next update. Features vary by plan.
Capture your screen, camera or both for demos, walkthroughs and updates.
Replace a video without changing the link or embed you've already shared.
Track views, watch time and where viewers stop watching.
Upload and manage videos through the API, or connect a compatible AI tool through MCP.



Playlists
Put demos, lessons or client previews in a playlist. Share the collection from one page.
Meet Vidnap Flow
Turn a playlist into a vertical viewing experience. Share a link or embed it on your site. Your audience just presses play.
Tap the sides to explore. The videos play on repeat.
Built for your stack
Add video uploads to your app or workflow. Send the file, let Vidnap process it, then share or embed the result.
Available on plans with API access.
import { createReadStream } from 'node:fs';
import { stat } from 'node:fs/promises';
import { basename } from 'node:path';
import { randomUUID } from 'node:crypto';
const file = './video.mp4';
const token = process.env.VIDNAP_API_TOKEN;
if (!token) throw new Error('Set VIDNAP_API_TOKEN');
const { size } = await stat(file);
if (size <= 0 || size >= 100_000_000) {
throw new Error('Use an MP4 under 100 MB for this example');
}
async function api(path, body) {
const response = await fetch(`https://api.vidnap.com/v1${path}`, {
method: body ? 'POST' : 'GET',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: body ? JSON.stringify(body) : undefined,
});
if (!response.ok) throw new Error(await response.text());
return response.json();
}
const upload = await api('/uploads/init', {
filename: basename(file), mimeType: 'video/mp4', size,
clientOperationId: randomUUID(),
});
if (!upload.uploadUrl) throw new Error('Direct upload URL missing');
const transfer = await fetch(upload.uploadUrl, {
method: 'PUT',
headers: { 'Content-Type': 'video/mp4', 'Content-Length': String(size) },
body: createReadStream(file),
duplex: 'half',
});
if (!transfer.ok) throw new Error(await transfer.text());
await transfer.arrayBuffer();
await api('/uploads/complete', { uploadId: upload.uploadId });
const status = await api(`/uploads/${encodeURIComponent(upload.uploadId)}`);
console.log(status);
Node.js 20+. Set VIDNAP_API_TOKEN with videos:upload and videos:read. Example for an MP4 under 100 MB; larger files use multipart. The upload URL lasts 60 seconds. Completion starts processing; the final request checks status once. Poll until completed or failed, respecting API rate limits.
Pricing
Choose the storage, tools and limits that fit your work.
FAQ
Yes. Create an account without a credit card. The Free plan has its own storage, upload and retention limits.
Public videos play from a link or embed without a vidnap account. Protected videos require the password or access you set.
Yes, on plans with 4K enabled. Upload size, storage and processing limits depend on your plan.
Yes. Copy the embed code for a video or playlist. Plans with domain restrictions let you choose which websites can use the player.
Compare the plans above for storage, upload limits and tools such as 4K, analytics and API access.
Upload a file. Get a link you can share.