{"id":38178,"date":"2025-08-13T07:00:00","date_gmt":"2025-08-13T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=38178"},"modified":"2025-10-31T13:08:40","modified_gmt":"2025-10-31T20:08:40","slug":"rebuilt-video-infrastructure-cloudinary-video-api","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api","title":{"rendered":"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API"},"content":{"rendered":"\n<p>Before switching to <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/documentation\/cloudinary_video\" rel=\"noreferrer noopener\">Cloudinary&#8217;s Video API<\/a>, the infrastructure I used worked to some extent, but it required a lot of manual work, processing and encoding videos, and getting them to load as fast as possible.<\/p>\n\n\n\n<p>Moving to Cloudinary improved my performance metrics significantly and eliminated the operational overhead of managing multiple video processing systems. In numbers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Video loading times decreased by 60% on average.<\/li>\n\n\n\n<li>The average video start time went from 3.2s to 0.8s.<\/li>\n\n\n\n<li>Jumping from one part of a video to another became almost instant.<\/li>\n<\/ul>\n\n\n\n<p>In this blog post, we\u2019ll go over a full technical breakdown of how the migration worked. We\u2019ll start with the original video infrastructure I was using and its challenges, before I walk you through the migration to the Cloudinary Video API. Finally, we\u2019ll go over the performance results I got from that migration and how you can replicate them.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Wasn\u2019t Working With My Original Video Stack<\/h2>\n\n\n\n<p>Like a lot of modern web projects, this one was put together with a variety of tools and systems. Without going into too many specifics, a significant part of that project was centered around video. If videos didn\u2019t load timely or users ran into regular errors during playback, it could ruin the whole experience.&nbsp;<\/p>\n\n\n\n<p>The original video \u201cstack\u201d I used consisted of multiple disconnected systems that created operational bottlenecks and performance issues. At one point, I realized that most of the errors I was running into were related to video playback, hence the need to find a new stack, or, in the case of Cloudinary, a one-stop solution.<\/p>\n\n\n\n<p>Here are the problems I encountered using my old video infrastructure.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Video <\/strong><strong>p<\/strong><strong>rocessing and <\/strong><strong>en<\/strong><strong>coding <\/strong><strong>p<\/strong><strong>roblems<\/strong><strong>.<\/strong> My video processing workflow relied on custom <a href=\"https:\/\/cloudinary.com\/glossary\/ffmpeg\" target=\"_blank\" rel=\"noreferrer noopener\">FFmpeg<\/a> scripts that required constant maintenance and monitoring. Every time I needed to support a new video format or adjust quality settings, I had to manually update encoding configurations and test them across different input types. The TL\u2019DR: I was spending significant time troubleshooting encoding failures, manually reprocessing videos, and ensuring consistent quality across different resolutions.<\/li>\n\n\n\n<li><strong>Mobile <\/strong><strong>v<\/strong><strong>ideo <\/strong><strong>o<\/strong><strong>ptimization <\/strong><strong>c<\/strong><strong>hallenges<\/strong><strong>.<\/strong>Mobile video delivery was a constant source of problems. I had to create different encoding profiles for various devices manually, manage adaptive bitrate streaming logic, and handle network condition changes.<\/li>\n\n\n\n<li><strong>Limited <\/strong><strong>v<\/strong><strong>ideo <\/strong><strong>a<\/strong><strong>nalytics and <\/strong><strong>m<\/strong><strong>onitoring<\/strong><strong>.<\/strong>Beyond basic server logs, I had zero insight into video performance metrics like buffering rates, playback success, or user engagement patterns. That\u2019s a big fail for a modern web project since, without analytics, you\u2019re essentially flying blind.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>The stack \u201cworked\u201d to some extent. Videos loaded, albeit sometimes slower than expected, and I\u2019d run into the occasional error depending on what type of device I accessed them from. However, there was room for improvement, which is where the Cloudinary Video API came in.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How I Rebuilt The Video Infrastructure Using Cloudinary<\/h2>\n\n\n\n<p>I evaluated several video infrastructure providers before choosing Cloudinary&#8217;s API-first approach. Using Cloudinary\u2019s API, I was able to automate video processing and encoding, as well as optimize files for mobile delivery, all with scalable code. Other platforms offer similar functionality, but integrating Cloudinary into my workflow was a straightforward process, thanks to great documentation.<\/p>\n\n\n\n<p>Here&#8217;s how I implemented the migration across four phases.<\/p>\n\n\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>If you don\u2019t want to deal with the API directly, Cloudinary also enables you to set up complex video transformation and optimization workflows using <a href=\"https:\/\/cloudinary.com\/products\/mediaflows\">MediaFlows<\/a>.<\/p>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Phase 1: Video Upload API Integration<\/h3>\n\n\n\n<p>The first step was replacing my FFmpeg processing with Cloudinary&#8217;s upload API. Using <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/documentation\/node_integration\" rel=\"noreferrer noopener\">Cloudinary&#8217;s Node.js SDK<\/a>, I replaced my FFmpeg processing with a single API call:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ New approach: Single API call handles all transformations<\/span>\n\n<span class=\"hljs-keyword\">const<\/span> result = <span class=\"hljs-keyword\">await<\/span> cloudinary.uploader.upload(videoFile, {\n\n\u00a0 <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">\"video\"<\/span>,\n\n\u00a0 <span class=\"hljs-attr\">eager<\/span>: &#91;\n\n\u00a0 \u00a0 { <span class=\"hljs-attr\">width<\/span>: <span class=\"hljs-number\">1920<\/span>, <span class=\"hljs-attr\">height<\/span>: <span class=\"hljs-number\">1080<\/span>, <span class=\"hljs-attr\">crop<\/span>: <span class=\"hljs-string\">\"limit\"<\/span>, <span class=\"hljs-attr\">quality<\/span>: <span class=\"hljs-string\">\"auto\"<\/span> },\n\n\u00a0 \u00a0 { <span class=\"hljs-attr\">width<\/span>: <span class=\"hljs-number\">1280<\/span>, <span class=\"hljs-attr\">height<\/span>: <span class=\"hljs-number\">720<\/span>, <span class=\"hljs-attr\">crop<\/span>: <span class=\"hljs-string\">\"limit\"<\/span>, <span class=\"hljs-attr\">quality<\/span>: <span class=\"hljs-string\">\"auto\"<\/span> },\n\n\u00a0 \u00a0 { <span class=\"hljs-attr\">width<\/span>: <span class=\"hljs-number\">854<\/span>, <span class=\"hljs-attr\">height<\/span>: <span class=\"hljs-number\">480<\/span>, <span class=\"hljs-attr\">crop<\/span>: <span class=\"hljs-string\">\"limit\"<\/span>, <span class=\"hljs-attr\">quality<\/span>: <span class=\"hljs-string\">\"auto\"<\/span> }\n\n\u00a0 ]\n\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>One important consideration: Cloudinary processes transformations asynchronously. When processing completes, it sends an HTTP callback (webhook) to notify my application that the video is ready, so I needed to set up an endpoint to receive these notifications.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 2: Video Delivery and Format Optimization<\/h3>\n\n\n\n<p>Cloudinary&#8217;s delivery system can automatically serve the optimal format based on which browser you\u2019re using. That means a lot less time spent optimizing video for delivery across different devices or use cases. With the Cloudinary API, you can use the <code>fetch_format<\/code> (or <a href=\"https:\/\/support.cloudinary.com\/hc\/en-us\/articles\/360016387579-How-to-set-an-automatic-format-selection-f-auto-when-using-eager-transformations\" target=\"_blank\" rel=\"noreferrer noopener\"><code>f_auto<\/code><\/a>) parameter to transcode video files on demand and automatically fetch the best option for each use case:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Cloudinary Node.js SDK - Automatic format and quality optimization<\/span>\n\n<span class=\"hljs-keyword\">const<\/span> videoUrl = cloudinary.url(<span class=\"hljs-string\">'sample-video'<\/span>, {\n\n\u00a0 <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'video'<\/span>,\n\n\u00a0 <span class=\"hljs-attr\">fetch_format<\/span>: <span class=\"hljs-string\">'auto'<\/span>,\n\n\u00a0 <span class=\"hljs-attr\">quality<\/span>: <span class=\"hljs-string\">'auto'<\/span>\n\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>I created a URL migration strategy to gradually transition existing embedded videos without breaking current implementations. This can be time-consuming if you\u2019re trying to migrate and optimize an existing library of content. However, it\u2019s definitely worth it if you\u2019re struggling with video performance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 3: Video Player API Implementation<\/h3>\n\n\n\n<p>Replacing the video player I was using with Cloudinary&#8217;s <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/documentation\/video_player_customization\" rel=\"noreferrer noopener\">fully customizable<\/a> Video Player required mapping my existing event tracking to the new system:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Mapping legacy analytics events to new player<\/span>\n\nplayer.on(<span class=\"hljs-string\">'play'<\/span>, (event) =&gt; {\n\n\u00a0 analytics.track(<span class=\"hljs-string\">'video_play'<\/span>, {\n\n\u00a0 \u00a0 video_id: event.publicId,\n\n\u00a0 \u00a0 duration: event.duration,\n\n\u00a0 \u00a0 quality: event.videoHeight\n\n\u00a0 });\n\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The transition period required running both tracking systems in parallel to ensure data accuracy. I gradually phased out the old HTML5 events once I verified that the new player events were providing consistent data.<\/p>\n\n\n\n<p>Right out of the gate, the <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/documentation\/cloudinary_video_player\" rel=\"noreferrer noopener\">Cloudinary Video Player<\/a> delivered a better, more user-friendly experience, including several accessibility features, like being able to easily set up captions:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/paper-attachments.dropboxusercontent.com\/s_7AAE8876F5DFB3BE49E030510C183D621F72F29879B8B90D5A86AD7219AB5C02_1748975053402_cloudinary-video-player.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">The Cloudinary Video Player<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 4: Advanced Video API Features<\/h3>\n\n\n\n<p>With the new implementation in place, it was time to take a look at some of Cloudinary\u2019s more advanced <a href=\"https:\/\/cloudinary.com\/guides\/web-performance\/video-optimization-why-you-need-it-and-5-critical-best-practices\">video optimization<\/a> functionality. Namely, adaptive streaming and <a href=\"https:\/\/cloudinary.com\/documentation\/video_analytics\" target=\"_blank\" rel=\"noreferrer noopener\">video analytics<\/a>, which were sorely missing from my initial implementation.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Cloudinary Video Player with adaptive streaming<\/span>\n\n<span class=\"hljs-keyword\">const<\/span> player = cloudinary.videoPlayer(<span class=\"hljs-string\">'player'<\/span>, {\n\n\u00a0 <span class=\"hljs-attr\">publicId<\/span>: <span class=\"hljs-string\">'sample-video'<\/span>,\n\n\u00a0 <span class=\"hljs-attr\">adaptive<\/span>: <span class=\"hljs-literal\">true<\/span>,\n\n\u00a0 <span class=\"hljs-attr\">fluid<\/span>: <span class=\"hljs-literal\">true<\/span>,\n\n\u00a0 <span class=\"hljs-attr\">controls<\/span>: <span class=\"hljs-literal\">true<\/span>\n\n});\n\n<span class=\"hljs-comment\">\/\/ Access to detailed video analytics via Node.js SDK<\/span>\n\n<span class=\"hljs-keyword\">const<\/span> analytics = <span class=\"hljs-keyword\">await<\/span> cloudinary.api.usage({\n\n\u00a0 <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'video'<\/span>,\n\n\u00a0 <span class=\"hljs-attr\">granularity<\/span>: <span class=\"hljs-string\">'daily'<\/span>\n\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The analytics API provided insights I never had before, including a detailed breakdown of bandwidth usage, transformation counts, and regional delivery performance. I could now see which video qualities were being served most frequently and optimize my encoding profiles accordingly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Video Infrastructure Architecture: Before and After Using the Cloudinary Video API<\/h2>\n\n\n\n<p><strong>Previou<\/strong><strong>s <\/strong><strong>a<\/strong><strong>rchitecture:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Multiple FFmpeg servers with inconsistent configurations and no orchestration.<\/li>\n\n\n\n<li>Manual mobile optimization with device-specific encoding profiles.<\/li>\n\n\n\n<li>No support for analytics.<\/li>\n<\/ul>\n\n\n\n<p><strong>Current <\/strong><strong>a<\/strong><strong>rchitecture:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Single Video API for upload and transformation.<\/li>\n\n\n\n<li>Cloudinary&#8217;s global CDN with automatic optimization and failover.<\/li>\n\n\n\n<li>Automatic mobile optimization with adaptive streaming.<\/li>\n\n\n\n<li>Comprehensive analytics and performance monitoring.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Additional Tips for Using the Cloudinary Video API<\/h2>\n\n\n\n<p>Overall, migrating from my previous video stack to Cloudinary was straightforward process. Using the API for video management helped me consolidate workflows since you can easily reuse code for most of your videos, at least for simple projects.<\/p>\n\n\n\n<p>After completing the video stack migration, I discovered additional Cloudinary optimizations that I hadn\u2019t initially considered but that could be valuable for your setup. Here\u2019s what I overlooked during the original migration<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Browser Compatibility and Format Negotiation<\/h3>\n\n\n\n<p>Some older browsers didn&#8217;t support automatic format selection. I implemented fallback logic for edge cases. In this case, if the browser doesn\u2019t support WebM, Cloudinary transcodes the file to MP4:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Cloudinary Node.js SDK - Fallback for browsers with limited format support<\/span>\n\n<span class=\"hljs-keyword\">if<\/span> (!player.canPlayType(<span class=\"hljs-string\">'video\/webm'<\/span>)) {\n\n\u00a0 videoUrl = cloudinary.url(<span class=\"hljs-string\">'sample-video'<\/span>, {\n\n\u00a0 \u00a0 <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'video'<\/span>,\n\n\u00a0 \u00a0 <span class=\"hljs-attr\">fetch_format<\/span>: <span class=\"hljs-string\">'mp4'<\/span>\n\n\u00a0 });\n\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>As I mentioned, these are edge cases. However, you\u2019d be surprised at how many people are still rocking old browsers like Internet Explorer (even though it\u2019s no longer supported). These cases were difficult to test for, but there are services that make it possible. <a target=\"_blank\" href=\"https:\/\/www.browserstack.com\/\" rel=\"noreferrer noopener\">BrowserStack<\/a>, for example, lets you test web applications across a broad range of browsers, including outdated options.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Video Processing Webhook Reliability<\/strong><\/h3>\n\n\n\n<p>Cloudinary sends webhook notifications when video transformations are complete. However, webhooks can occasionally fail due to network issues or server downtime. When this happens, your application continues waiting for a transformation that&#8217;s actually finished.<\/p>\n\n\n\n<p>I implemented a polling fallback to check transformation status directly via API when webhooks don&#8217;t arrive:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Using Cloudinary Node.js SDK, polls the API to check if a video transformation has completed<\/span>\n\n<span class=\"hljs-keyword\">const<\/span> pollForCompletion = <span class=\"hljs-keyword\">async<\/span> (publicId) =&gt; {\n\n\u00a0 <span class=\"hljs-keyword\">let<\/span> attempts = <span class=\"hljs-number\">0<\/span>;\n\n\u00a0 <span class=\"hljs-comment\">\/\/ Try up to 20 times before timing out<\/span>\n\n\u00a0 <span class=\"hljs-keyword\">while<\/span> (attempts &lt; <span class=\"hljs-number\">20<\/span>) {\n\n\u00a0 \u00a0 <span class=\"hljs-comment\">\/\/ Fetch the current status of the video resource<\/span>\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">const<\/span> resource = <span class=\"hljs-keyword\">await<\/span> cloudinary.api.resource(publicId, {\n\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'video'<\/span>\n\n\u00a0 \u00a0 });\n\n\u00a0 \u00a0 <span class=\"hljs-comment\">\/\/ If transformation is complete, return the resource data<\/span>\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">if<\/span> (resource.status === <span class=\"hljs-string\">'complete'<\/span>) <span class=\"hljs-keyword\">return<\/span> resource;\n\n\u00a0 \u00a0 <span class=\"hljs-comment\">\/\/ Wait 5 seconds before polling again<\/span>\n\n\u00a0 \u00a0 <span class=\"hljs-keyword\">await<\/span> sleep(<span class=\"hljs-number\">5000<\/span>);\n\n\u00a0 \u00a0 attempts++;\n\n\u00a0 }\n\n\u00a0 <span class=\"hljs-comment\">\/\/ After 20 failed attempts, throw a timeout error<\/span>\n\n\u00a0 <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Error<\/span>(<span class=\"hljs-string\">'Video processing timeout'<\/span>);\n\n};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Video Performance Results and Metrics<\/h2>\n\n\n\n<p>After completing the migration, I measured significant improvements across multiple metrics:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Video Loading and Playback Performance<\/h3>\n\n\n\n<p>The most significant improvements were in video delivery performance. By leveraging Cloudinary&#8217;s automatic optimizations and global CDN, I measured substantial improvements across key metrics that directly impact user experience.<\/p>\n\n\n\n<p>On average, <strong>video load times decreased by 60%<\/strong> through automatic format optimization. Here\u2019s a quick example of how fast a test video file (approximately 13MB) loads using Cloudinary to serve the content:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/paper-attachments.dropboxusercontent.com\/s_7AAE8876F5DFB3BE49E030510C183D621F72F29879B8B90D5A86AD7219AB5C02_1748976428908_cloudinary-video-load-time.gif\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Using the Cloudinary Video Player to serve content<\/figcaption><\/figure>\n\n\n\n<p>These performance gains were possible because Cloudinary automatically serves the optimal video format and quality for each user&#8217;s device and network conditions, while its global CDN ensures faster delivery through geographically distributed edge servers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Development and Operations Efficiency<\/h3>\n\n\n\n<p>Beyond performance improvements, the migration significantly reduced the operational burden of managing <a href=\"https:\/\/cloudinary.com\/guides\/video\/video-infrastructure\">video infrastructure<\/a>. The shift from manual processes to API-driven automation freed up considerable development time. Here are the improvements by the numbers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Video processing automation eliminated a good portion of manual work<\/strong> (optimizing videos manually, selecting the best formats for each use case, setting up complex fallbacks, and more).<\/li>\n\n\n\n<li><strong>Deployment complexity was reduced significantly<\/strong> by removing CDN configuration management, since Cloudinary uses its own CDN.<\/li>\n\n\n\n<li><strong>Cross-browser compatibility issues were eliminated almost completely <\/strong>since Cloudinary can select the best video format for each use case.<\/li>\n<\/ul>\n\n\n\n<p>Instead of spending time troubleshooting encoding failures and managing server configurations, I could focus on building features that improved the user experience. It&#8217;s a win-win for me, as I spend less time on optimization, and for users, since loading and reproducing videos is now smoother.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">User Experience Improvements<\/h3>\n\n\n\n<p>The infrastructure changes had a direct impact on how visitors interacted with video content on the site. Here are the actual numbers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Average video start time improved from 3.2 seconds to 0.8 seconds<\/strong>.<\/li>\n\n\n\n<li><strong>Mobile playback issues decreased significantly<\/strong> with the responsive Cloudinary player (which I tested using BrowserStack).<\/li>\n\n\n\n<li><strong>It became faster to jump from one part of the video to the next<\/strong><strong>.<\/strong><\/li>\n<\/ul>\n\n\n\n<p>To put those improvements into context, I put together a test with identical videos side-by-side. The video on the left is the unoptimized version, whereas the one to the right is served using the Cloudinary API:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/paper-attachments.dropboxusercontent.com\/s_7AAE8876F5DFB3BE49E030510C183D621F72F29879B8B90D5A86AD7219AB5C02_1748978229778_unoptimized-video-comparison.gif\" alt=\"\"\/><figcaption class=\"wp-element-caption\">A side-by-side comparison using unoptimized video and the Cloudinary Video API<\/figcaption><\/figure>\n\n\n\n<p>Slow-loading videos and playback errors can be very frustrating to deal with as a user. Being able to reduce them means dealing with fewer support requests and users ditching the app for an alternative.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Video API Migration Checklist<\/h2>\n\n\n\n<p>If you want a simple checklist you can reference while migrating to the Cloudinary Video API from a different solution, here it is. This checklist follows the processes I\u2019ve outlined throughout the article and links you to the corresponding documentation you may need to review.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Premigration Planning<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Audit existing video URLs and create migration strategy.<\/li>\n\n\n\n<li>Map current player events to new <a href=\"https:\/\/cloudinary.com\/documentation\/video_player_api_reference\" target=\"_blank\" rel=\"noreferrer noopener\">video API system<\/a>.<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/notifications\" target=\"_blank\" rel=\"noreferrer noopener\">Set up webhook handling<\/a> with polling fallback.<\/li>\n\n\n\n<li>Plan gradual rollout rather than complete system replacement.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Technical Implementation<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Test automatic format selection with actual user base (or web app testing tools).<\/li>\n\n\n\n<li>Set up monitoring for video transformation completion.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Process Preparation<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go through the <a href=\"https:\/\/cloudinary.com\/documentation\/cloudinary_video\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudinary Video API documentation<\/a> to prepare for implementation.<\/li>\n\n\n\n<li>Set up staging environments matching production configuration.<\/li>\n\n\n\n<li>Plan support for parallel old and new systems during the transition (if you have an existing user base).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Key Takeaways for Video Infrastructure Migration<\/h2>\n\n\n\n<p>Based on my experience migrating to the Cloudinary Video API, I recommend that you start with new uploads and monitor everything from day one. I routed new videos through Cloudinary while keeping existing content on the legacy system, which let me validate performance without breaking current functionality. The analytics insights from Cloudinary were immediately valuable for understanding video delivery patterns while completing the rebuilding process.<\/p>\n\n\n\n<p>Aside from that, allocate extra time for edge cases and plan a gradual transition. Every video setup has unique quirks that take time to resolve. Running both systems in parallel eliminated user-facing issues while I worked through compatibility challenges. Overall, the operational time savings and performance improvements more than made up for the time it took me to set up the new video infrastructure using Cloudinary.<\/p>\n\n\n\n<p><strong>If you\u2019re facing similar scaling or performance issues with video, Cloudinary\u2019s programmable video workflows are worth exploring.<\/strong> <a target=\"_blank\" href=\"https:\/\/cloudinary.com\/users\/register\/free\" rel=\"noreferrer noopener\">Sign up on Cloudinary<\/a> to start building your own programmable video workflows.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/video_manipulation_and_delivery\" target=\"_blank\" rel=\"noreferrer noopener\">Video Transformations<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/products\/mediaflows\" target=\"_blank\" rel=\"noreferrer noopener\">MediaFlows<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/cloudinary_video_player\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudinary Video Player<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/video_analytics\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudinary Video Analytics<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Before switching to Cloudinary&#8217;s Video API, the infrastructure I used worked to some extent, but it required a lot of manual work, processing and encoding videos, and getting them to load as fast as possible. Moving to Cloudinary improved my performance metrics significantly and eliminated the operational overhead of managing multiple video processing systems. In [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":38179,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[303,305],"class_list":["post-38178","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-video","tag-video-api"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How I Rebuilt Our Video Infrastructure Using Cloudinary Video API<\/title>\n<meta name=\"description\" content=\"Step-by-step rebuild of our video infrastructure using Cloudinary\u2019s API, with performance results and lessons for teams handling video at scale.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API\" \/>\n<meta property=\"og:description\" content=\"Step-by-step rebuild of our video infrastructure using Cloudinary\u2019s API, with performance results and lessons for teams handling video at scale.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-13T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-31T20:08:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API\",\"datePublished\":\"2025-08-13T14:00:00+00:00\",\"dateModified\":\"2025-10-31T20:08:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api\"},\"wordCount\":1966,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA\",\"keywords\":[\"Video\",\"Video API\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api\",\"url\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api\",\"name\":\"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA\",\"datePublished\":\"2025-08-13T14:00:00+00:00\",\"dateModified\":\"2025-10-31T20:08:40+00:00\",\"description\":\"Step-by-step rebuild of our video infrastructure using Cloudinary\u2019s API, with performance results and lessons for teams handling video at scale.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API","description":"Step-by-step rebuild of our video infrastructure using Cloudinary\u2019s API, with performance results and lessons for teams handling video at scale.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api","og_locale":"en_US","og_type":"article","og_title":"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API","og_description":"Step-by-step rebuild of our video infrastructure using Cloudinary\u2019s API, with performance results and lessons for teams handling video at scale.","og_url":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api","og_site_name":"Cloudinary Blog","article_published_time":"2025-08-13T14:00:00+00:00","article_modified_time":"2025-10-31T20:08:40+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API","datePublished":"2025-08-13T14:00:00+00:00","dateModified":"2025-10-31T20:08:40+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api"},"wordCount":1966,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA","keywords":["Video","Video API"],"inLanguage":"en-US","copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api","url":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api","name":"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA","datePublished":"2025-08-13T14:00:00+00:00","dateModified":"2025-10-31T20:08:40+00:00","description":"Step-by-step rebuild of our video infrastructure using Cloudinary\u2019s API, with performance results and lessons for teams handling video at scale.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/rebuilt-video-infrastructure-cloudinary-video-api#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How I Rebuilt Our Video Infrastructure Using Cloudinary Video API"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1754677112\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API\/Blog_How_I_Rebuilt_Our_Video_Infrastructure_Using_Cloudinary_Video_API.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=38178"}],"version-history":[{"count":5,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38178\/revisions"}],"predecessor-version":[{"id":39050,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/38178\/revisions\/39050"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/38179"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=38178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=38178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=38178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}