Start Managing Video Assets with Cloudinary
A step-by-step guide to setting up cloud-based video management with upload, transformation, and delivery — all working within 60 seconds.
What you'll set up
By the end of this guide, you will have a working video management environment that handles three things: upload (get video files into cloud storage with automatic analysis), transformation (crop, resize, change format, and optimize quality using URL parameters), and delivery (serve video globally through a CDN with adaptive bitrate streaming). No infrastructure to provision, no transcoding pipeline to build, no CDN to configure. The entire setup runs on Cloudinary's free tier, which includes 25 GB of storage and 25 GB of bandwidth per month — enough to evaluate the platform with real production content, not just demo clips.
Cloudinary is an API-first media platform. Every capability — upload, transformation, metadata, delivery — is available through a REST API with SDKs for JavaScript, Python, Ruby, Go, Java, PHP, .NET, and more. The web-based Media Library provides a visual interface for browsing, searching, and organizing assets, built on top of the same API. This guide uses the JavaScript SDK, but the concepts apply to any language.
If you have worked with cloud storage services like S3 or GCS, Cloudinary will feel familiar — but with a critical difference. Cloud storage services store and serve files. Cloudinary stores, analyzes, transforms, optimizes, and delivers media. The transformation and delivery capabilities are built into the platform rather than bolted on through external services, which means you do not need to manage a separate transcoding pipeline, a separate CDN, or a separate image/video processing layer.
Step 1: Create a free account
Sign up at cloudinary.com/signup. No credit card is required. The free tier includes 25 credits per month, which bundle storage, transformations, and bandwidth into a single unit. For context, 25 credits supports roughly 25 GB of storage, 25 GB of delivery bandwidth, and thousands of transformations — more than enough to run a complete proof of concept with your actual video content.
After registration, you will see your cloud name, API key, and API secret in the dashboard. These three values are all you need to connect from code. The cloud name is your unique namespace — all your assets and delivery URLs include it.
Store these credentials as environment variables rather than hardcoding them. Cloudinary SDKs automatically read from a CLOUDINARY_URL environment variable in the format cloudinary://API_KEY:API_SECRET@CLOUD_NAME, so you can configure once and use across all your applications without passing credentials explicitly.
Step 2: Upload your first video
Install the Cloudinary Node.js SDK and upload a video file. The SDK handles authentication, multipart upload, chunked transfer for large files, and response parsing. For video files over 100 MB, the SDK automatically splits the upload into 20 MB chunks and reassembles them on the server, so you do not need to implement resumable uploads yourself.
// Install: npm install cloudinary
const cloudinary = require('cloudinary').v2;
cloudinary.config({
cloud_name: 'your_cloud_name',
api_key: 'your_api_key',
api_secret: 'your_api_secret',
});
const result = await cloudinary.uploader.upload(
'product-demo.mp4',
{
resource_type: 'video',
folder: 'products',
}
);
console.log(result.public_id); // "products/product-demo"
console.log(result.secure_url); // "https://res.cloudinary.com/..."
console.log(result.duration); // 34.5 (seconds)
console.log(result.format); // "mp4"When the upload completes, Cloudinary automatically analyzes the video: extracting technical metadata (duration, resolution, codec, frame rate, bitrate), generating a thumbnail, and assigning a unique public ID that you use to reference the asset in all subsequent operations. The video is stored on Cloudinary's cloud infrastructure and replicated across multiple availability zones — no S3 buckets to configure, no storage classes to manage.
The upload response includes everything Cloudinary detected about the video: width, height, frame rate, codec, audio channels, bit rate, and a unique etag for deduplication. If you upload the same file again, Cloudinary detects the duplicate and returns the existing asset rather than consuming additional storage — useful for workflows where the same source file might arrive from multiple channels.
For client-side uploads (directly from a browser or mobile app), use signed upload URLs or upload presets to authorize the upload without exposing your API secret. This lets end users upload video directly to Cloudinary without the file passing through your backend server, reducing latency and server bandwidth costs.
// Client-side upload with the Upload Widget
cloudinary.openUploadWidget(
{
cloudName: 'your_cloud_name',
uploadPreset: 'unsigned_preset',
sources: ['local', 'url', 'camera'],
resourceType: 'video',
},
(error, result) => {
if (result.event === 'success') {
console.log('Uploaded:', result.info.public_id);
}
}
);Step 3: Transform and deliver
This is where Cloudinary's URL-based transformation model becomes powerful. Instead of running transcoding jobs and waiting for output, you modify the delivery URL to specify what you want — and the transformation is applied on first request, then cached at the CDN edge for all subsequent viewers.
Start with your original video URL:
# Original video — delivered as-is from cloud storage
https://res.cloudinary.com/demo/video/upload/product-demo.mp4Add transformation parameters to resize, optimize, and change the format:
# Resize to 720p with smart crop (fills frame, centers on subject)
https://res.cloudinary.com/demo/video/upload/w_1280,h_720,c_fill/product-demo.mp4
# Auto quality — Cloudinary picks the optimal bitrate per scene
https://res.cloudinary.com/demo/video/upload/q_auto/product-demo.mp4
# Auto format — serves WebM to Chrome, MP4 to Safari, best match per browser
https://res.cloudinary.com/demo/video/upload/q_auto/f_auto/product-demo.mp4
# Combine everything: resize + quality + format in one URL
https://res.cloudinary.com/demo/video/upload/w_1280,h_720,c_fill/q_auto/f_auto/product-demo.mp4For adaptive bitrate streaming, change the file extension to generate an HLS manifest:
# Generate HLS adaptive bitrate stream with automatic quality ladder
https://res.cloudinary.com/demo/video/upload/sp_auto/product-demo.m3u8The sp_auto parameter tells Cloudinary to generate a complete ABR ladder automatically — multiple quality levels that the player switches between based on the viewer's bandwidth. No manual encoding profiles, no rendition management, no HLS packaging tools. The manifest and segments are generated on first request and cached globally.
You can also add overlays (text, images, or other videos), trim clips, concatenate multiple videos, extract thumbnails at specific timestamps, and generate animated GIF previews — all through URL parameters. Every transformation is a GET request. Every result is cached. Nothing requires a processing job or a callback.
The caching model is worth understanding because it changes how you think about video processing. The first request for a transformed video triggers the transformation, which takes a few seconds depending on the video length and the complexity of the operation. Every subsequent request for the same transformation URL is served from the CDN cache — typically in under 50 milliseconds from the nearest edge location. This means you can safely use transformation URLs in production without worrying about latency: the first viewer pays the processing cost, and everyone after that gets the cached result.
If you want to pre-generate transformations (for example, to ensure that the first viewer never experiences a delay), use the eager transformations parameter during upload. This tells Cloudinary to generate the specified transformations immediately after upload completes, before anyone requests them.
Step 4: Explore further
With upload and transformation working, you have the foundation of a video management pipeline. From here, you can build in any direction — the platform supports dozens of capabilities that layer on top of this foundation. The next steps depend on your use case, but the most common paths are:
- AI-powered metadata: Enable auto-tagging and speech-to-text transcription to make your library searchable without manual tagging.
- Webhook integration: Register webhooks to receive notifications when uploads complete, transcoding finishes, or moderation flags content — enabling fully asynchronous, event-driven workflows.
- Access control: Use signed URLs and access tokens to restrict who can view or download specific assets.
- Player integration: Embed the Cloudinary Video Player for adaptive streaming with analytics, captions, and chapter navigation built in.
- Multi-environment setup: Create separate folders or sub-accounts for staging and production environments with promotion workflows between them.
Each of these capabilities is available from day one on the free tier. You do not need to upgrade to access AI features, streaming, or access control — the free tier includes the full platform functionality, limited only by usage credits. This means you can evaluate the complete platform with your actual video content and your actual workflow before making any purchasing decision.
For comprehensive API reference and SDK documentation, visit the Cloudinary documentation. For deeper understanding of the technical concepts behind video management — codecs, streaming protocols, metadata standards, storage optimization — explore the articles linked below.
Create your free account
25 GB storage, 25 GB bandwidth, no credit card required. Upload, transform, and deliver video in minutes — not months.
Start Free with Cloudinary