Products
Products
Video Hosting
Upload and manage your videos in a centralized video library.
Image Hosting
Upload and manage all your images in a centralized library.
Galleries
Choose from 100+templates to showcase your media in style.
Video Messaging
Record, and send personalized video messages.
CincoTube
Create your own community video hub your team, students or fans.
Pages
Create dedicated webpages to share your videos and images.
Live
Create dedicated webpages to share your videos and images.
For Developers
Video API
Build a unique video experience.
DeepUploader
Collect and store user content from anywhere with our file uploader.
Solutions
Solutions
Enterprise
Supercharge your business with secure, internal communication.
Townhall
Webinars
Team Collaboration
Learning & Development
Creative Professionals
Get creative with a built in-suite of editing and marketing tools.
eCommerce
Boost sales with interactive video and easy-embedding.
Townhall
Webinars
Team Collaboration
Learning & Development
eLearning & Training
Host and share course materials in a centralized portal.
Sales & Marketing
Attract, engage and convert with interactive tools and analytics.
"Cincopa helped my Enterprise organization collaborate better through video."
Book a Demo
Resources
Resources
Blog
Learn about the latest industry trends, tips & tricks.
Help Centre
Get access to help articles FAQs, and all things Cincopa.
Partners
Check out our valued list of partners.
Product Updates
Stay up-to-date with our latest greatest features.
Ebooks, Guides & More
Customer Stories
Hear how we've helped businesses succeed.
Boost Campaign Performance Through Video
Discover how to boost your next campaign by using video.
Download Now
Pricing
Watch a Demo
Demo
Login
Start Free Trial
Integrating video hosting into Strapi Projects ensures faster content delivery, reduced server load, and a smoother playback experience. For media-heavy platforms like e-learning portals or streaming apps, connecting Strapi with a cloud video provider makes video storage, optimization, and delivery scalable. Prerequisites A working Strapi project Node.js installed on your machine An account with a video-capable cloud storage provider (e.g., AWS S3 with MediaConvert). Access credentials for the chosen provider (e.g., API key, API secret, access token, or bucket credentials depending on the service). Set Up Media Storage in Strapi Strapi’s default local upload isn’t suitable for production, so you need to configure a cloud provider like AWS S3. This involves installing the provider package and configuring environment variables. It replaces local storage with scalable & production-ready hosting for your media files. Install the Provider Plugin Run the plugin installation in your project root: npm install @strapi/provider-upload-aws-s3 This allows Strapi to route uploads to your cloud storage instead of the local filesystem. Configure Environment Variables Hardcoding credentials is insecure and inflexible. Environment variables keep secrets out of source control and make it easy to switch between dev, staging, and production. Create or edit your .env file in the project root to include your cloud provider's credentials and bucket details. AWS_ACCESS_KEY_ID=your_access_key_id AWS_ACCESS_SECRET=your_secret_access_key AWS_REGION=us-east-1 AWS_BUCKET=your_bucket_name Explanation: AWS_REGION : The AWS region where your resources (like S3 buckets) are hosted. Example: us-east-1 . AWS_BUCKET : The name of your Amazon S3 bucket where media files will be stored. Connect Strapi to the Provider Strapi must know which provider to use and how to connect to it. The plugins .js file in Strapi project configuration reads your environment variables and passes them to the provider, completing the backend setup for cloud-based video storage. module.exports = ({ env }) => ({ upload: { config: { provider: 'aws-s3', providerOptions: { accessKeyId: env('AWS_ACCESS_KEY_ID'), secretAccessKey: env('AWS_ACCESS_SECRET'), region: env('AWS_REGION'), params: { Bucket: env('AWS_BUCKET'), }, }, }, }, }); Explanation : accessKeyId: env('AWS_ACCESS_KEY_ID') : Reads your AWS access key ID from environment variables. secretAccessKey: env('AWS_ACCESS_SECRET') : Reads your AWS secret key for secure authentication. params: { Bucket: env('AWS_BUCKET') } : Specifies the target S3 bucket where files will be uploaded. Handling Large File Uploads By default, Strapi blocks large uploads. For video projects, that’s a bottleneck. Increasing the limits in ./config/middlewares.js to raise limits ensures your backend accepts high-resolution or long-duration videos without crashing. // ./config/middlewares.js module.exports = [ 'strapi::errors', { name: 'strapi::body', config: { formLimit: '200mb', jsonLimit: '200mb', textLimit: '200mb', }, }, 'strapi::security', 'strapi::cors', ]; Explanation : module.exports = [ ... ] : Exports middleware configurations that Strapi will apply globally. { name: 'strapi::body', config: { ... } } : Configures the body parser middleware to process incoming request payloads. 'strapi::security' : Adds standard security headers to protect your application from common web vulnerabilities. 'strapi::cors' : Allows Cross-Origin Resource Sharing (CORS) so your frontend can make requests to the Strapi API. Create a Video Content Type Define a Video collection type with fields like title and video . Separating video metadata from the file itself makes videos easy to search, manage, and retrieve through Strapi’s API. // This is a conceptual representation of the created content type. { 'kind': 'collectionType', 'collectionName': 'videos', 'attributes': { 'title': { 'type': 'string' }, 'video': { 'type': 'media', 'multiple': false, 'required': true, 'allowedTypes': [ 'videos' ] } } } Explanation : collectionName: 'videos' : The database table name that will hold video entries. attributes: { ... } : Defines the fields (columns) for each video entry. Upload and Access Videos via Admin Panel By configuring the Video content type, editors can upload videos from Strapi’s admin interface. This ensures that files are sent to the cloud provider securely while metadata like title, MIME type, and size is stored in the database. This keeps your media organized and accessible via the API. { 'id': 1, 'title': 'Demo Video', 'video': { 'id': 5, 'name': 'sample.mp4', 'url': 'https://your-bucket.s3.region.amazonaws.com/sample.mp4', 'provider': 'aws-s3', 'mime': 'video/mp4', 'size': 24500 } } Explanation : provider: 'aws-s3' : Indicates that the file is stored using the AWS S3 provider. mime: 'video/mp4' : MIME type of the file, describing its format (mp4 video). Access Videos via API Strapi generates REST and GraphQL endpoints for all content types, including videos. Accessing these endpoints allows your frontend to fetch video metadata and cloud-hosted file URLs. This provides the links to display or stream videos in browsers or player libraries. REST Example : { 'data': [ { 'id': 1, 'attributes': { 'title': 'My First Hosted Video', 'video': { 'data': { 'attributes': { 'url': 'https://your-bucket.s3.region.amazonaws.com/video_file.mp4' } } } } } ] } Explanation : data: [ ... ] : The root property returned by Strapi contains an array of entries (in this case, video entries). attributes: { ... } : Contains all the actual fields defined in the content type (e.g., title , video ). GraphQL Example : query { videos { data { id attributes { title video { data { attributes { url } } } } } } } Enable Streaming & Thumbnails Videos can be processed into multiple resolutions and formats and paired with thumbnails. This ensures smooth playback across devices and networks, while thumbnails improve UX by giving users previews. { 'title': 'Demo Video', 'video': { 'url': 's3://bucket/video.mp4' }, 'thumbnail': { 'url': 's3://bucket/frame.jpg' }, 'streaming': { 'hls': 'https://stream-service.com/playlist.m3u8', 'dash': 'https://stream-service.com/manifest.mpd' } } After converting the original video into multiple resolutions with HLS/DASH, the generated streaming URLs are stored in the entry. This ensures device-compatible playback and avoids serving large MP4 files directly. { 'id': 1, 'title': 'Demo Video', 'video': { 'url': 'https://your-bucket.s3.region.amazonaws.com/original.mp4' }, 'streaming': { 'hls': 'https://streaming-service.com/video/playlist.m3u8', 'dash': 'https://streaming-service.com/video/manifest.mpd' } } Explanation : hls: 'https://.../playlist.m3u8' : HLS (HTTP Live Streaming) URL, optimized for iOS and browsers. dash: 'https://.../manifest.mpd' : MPEG-DASH URL, supported by many modern players and devices. Integrate on Frontend Strapi’s API can be consumed in an HTML
element or with player libraries like Video.js or hls.js . Using adaptive players improves playback quality, supports multiple resolutions, and reduces buffering issues for end users.
To display hosted videos, fetch them from Strapi’s API with populate=* to include file URLs. The frontend can then use these URLs directly in an HTML5
element or pass them to a player library for advanced streaming features. const response = await fetch('http://your-strapi-app.com/api/videos?populate=*'); const jsonData = await response.json(); const videoUrl = jsonData.data[0].attributes.video.data.attributes.url; Implement Adaptive Streaming Using HLS or DASH manifests with a player library like hls.js or Video.js allows adaptive streaming. This ensures smooth playback across different devices and network conditions while supporting multiple bitrates and resolutions. if (Hls.isSupported()) { const video = document.getElementById('video'); const hls = new Hls(); hls.loadSource('https://streaming-service.com/playlist.m3u8'); hls.attachMedia(video); } Explanation : Hls.loadSource : loads the streaming manifest. hls.attachMedia(video) : binds the stream to the HTML video element.