Pinterest Video Downloader - PINNED VIDEO

The website is mainly dedicated to downloading Pinterest videos, images, and GIFs online for free (without watermark).

🎉 Just Launched: Twitter Video Downloader
Videos
Images
GIFs

What's New Here!!

Latest Fixes

  • Downloading WebP, GIF, ICO, CUR, TIF, SVG, and BMP format images from Pinterest has been fixed.
  • Added a new Download button for Artwork while downloading GIF files.
  • The landing page will display consecutive header tags for Image, Video, and GIF.

Design Refresh

  • This update brings a new design refresh for a simpler and better experience overall as well as some minor fixes.
  • We updated the home page and download page making them more easier to use and mobile friendly.
  • We also fixed some issues and added some tweaks for a faster downloader.
  • PINNED VIDEO is now secure with full HTTPS support.
  • Download Pinterest GIFs along with videos and images with multi-format support.

About PINNED VIDEO

PINNED VIDEO is a free online tool that allows you to download videos, images, and GIFs from Pinterest without any watermarks. Our service is fast, reliable, and completely free to use.

We believe in providing a simple, user-friendly experience that respects your privacy. No login required, no tracking, just pure downloading functionality.

Is PINNED VIDEO Safe to Use?

Yes, PINNED VIDEO is completely safe.

  • It doesn't ask for login or Pinterest credentials
  • It doesn't track you or show pop-up ads
  • It works directly through your browser

We believe in privacy-first tools that are easy to use and respectful of user data.

Google Safe Browsing Norton Safe Web Sucuri Scanner

Frequently Asked Questions

If the video is playing instead of downloading, try right-clicking on the video and selecting "Save video as..." or use the download button provided on the page.
Yes, PINNED VIDEO is fully responsive and works on all mobile devices including smartphones and tablets.
Currently, PINNED VIDEO supports downloading individual pins. Board downloading feature may be available in future updates.
Yes, you can download Pinterest artwork including images, videos, and GIFs using PINNED VIDEO.
No, PINNED VIDEO does not store any downloaded files. All downloads are processed directly through your browser.
Yes, we are working on browser extensions for Chrome and other popular browsers. Stay tuned for updates!
downloadResult.classList.add('active'); } } function showDownloadModal(data) { // Determine type - check URL extension if type is not reliable let type = data.type || 'image'; const url = data.url || ''; // Double-check type based on URL extension if type seems wrong if (type === 'image' && url) { const urlLower = url.toLowerCase(); if (urlLower.includes('.mp4') || urlLower.includes('.webm') || urlLower.includes('.m3u8') || urlLower.includes('.mov') || urlLower.includes('.avi') || urlLower.includes('.mkv')) { // It's a video file, check if it might be a GIF (short video) type = 'video'; // Default to video, will be checked by duration } else if (urlLower.includes('.gif')) { type = 'gif'; } } const typeIcon = type === 'video' ? 'fa-video' : (type === 'gif' ? 'fa-file-video' : 'fa-image'); const typeLabel = type.charAt(0).toUpperCase() + type.slice(1); // Update type badge if (modalTypeBadge) { modalTypeBadge.innerHTML = `${typeLabel}`; } // Update title if (modalTitle) { modalTitle.textContent = data.title || 'Ready to Download'; } // Update preview - show video player for videos and GIFs if (modalPreviewImg && modalPreviewVideo) { if (type === 'video' || type === 'gif') { modalPreviewImg.style.display = 'none'; modalPreviewVideo.style.display = 'block'; const source = modalPreviewVideo.querySelector('source'); if (source) { source.src = url; } else { modalPreviewVideo.src = url; } if (data.thumbnail) { modalPreviewVideo.poster = data.thumbnail; } modalPreviewVideo.load(); } else { modalPreviewVideo.style.display = 'none'; modalPreviewImg.style.display = 'block'; modalPreviewImg.src = data.thumbnail || url; } } // Update download button if (modalDownloadBtn) { modalDownloadBtn.dataset.url = url; modalDownloadBtn.dataset.type = type; // Use corrected type } if (modalDownloadText) { modalDownloadText.textContent = `Download ${typeLabel}`; } // Open modal openModal(); } // Handle download button click if (modalDownloadBtn) { modalDownloadBtn.addEventListener('click', async function(e) { e.preventDefault(); const type = this.dataset.type; // Use the original Pinterest URL, not the direct content URL if (!currentPinterestUrl) { alert('Download URL not available'); return; } // Show loading state const originalText = modalDownloadText.textContent; modalDownloadText.textContent = 'Downloading...'; modalDownloadBtn.disabled = true; try { // Use the download API endpoint with original Pinterest URL const response = await fetch('api/download.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: currentPinterestUrl }) }); if (!response.ok) { const errorData = await response.json().catch(() => ({})); throw new Error(errorData.error || 'Download failed'); } const blob = await response.blob(); // Determine filename and extension let ext = 'jpg'; if (type === 'video') ext = 'mp4'; else if (type === 'gif') ext = 'gif'; else if (this.dataset.url && this.dataset.url.includes('.png')) ext = 'png'; else if (this.dataset.url && this.dataset.url.includes('.webp')) ext = 'webp'; const filename = `pinterest_${Date.now()}.${ext}`; // Create download link const downloadUrl = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = downloadUrl; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); window.URL.revokeObjectURL(downloadUrl); modalDownloadText.textContent = 'Downloaded!'; setTimeout(() => { modalDownloadText.textContent = originalText; }, 2000); } catch (error) { console.error('Download error:', error); alert('Download failed: ' + error.message); modalDownloadText.textContent = originalText; } finally { modalDownloadBtn.disabled = false; } }); } })(); // Close nested IIFE } // Close initApp function // Initialize app if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initApp); } else { initApp(); } })(); // Close outer IIFE downloadResult.classList.add('active'); } } function showDownloadModal(data) { // Determine type - check URL extension if type is not reliable let type = data.type || 'image'; const url = data.url || ''; // Double-check type based on URL extension if type seems wrong if (type === 'image' && url) { const urlLower = url.toLowerCase(); if (urlLower.includes('.mp4') || urlLower.includes('.webm') || urlLower.includes('.m3u8') || urlLower.includes('.mov') || urlLower.includes('.avi') || urlLower.includes('.mkv')) { // It's a video file, check if it might be a GIF (short video) type = 'video'; // Default to video, will be checked by duration } else if (urlLower.includes('.gif')) { type = 'gif'; } } const typeIcon = type === 'video' ? 'fa-video' : (type === 'gif' ? 'fa-file-video' : 'fa-image'); const typeLabel = type.charAt(0).toUpperCase() + type.slice(1); // Update type badge if (modalTypeBadge) { modalTypeBadge.innerHTML = `${typeLabel}`; } // Update title if (modalTitle) { modalTitle.textContent = data.title || 'Ready to Download'; } // Update preview - show video player for videos and GIFs if (modalPreviewImg && modalPreviewVideo) { if (type === 'video' || type === 'gif') { modalPreviewImg.style.display = 'none'; modalPreviewVideo.style.display = 'block'; const source = modalPreviewVideo.querySelector('source'); if (source) { source.src = url; } else { modalPreviewVideo.src = url; } if (data.thumbnail) { modalPreviewVideo.poster = data.thumbnail; } modalPreviewVideo.load(); } else { modalPreviewVideo.style.display = 'none'; modalPreviewImg.style.display = 'block'; modalPreviewImg.src = data.thumbnail || url; } } // Update download button if (modalDownloadBtn) { modalDownloadBtn.dataset.url = url; modalDownloadBtn.dataset.type = type; // Use corrected type } if (modalDownloadText) { modalDownloadText.textContent = `Download ${typeLabel}`; } // Open modal openModal(); } // Handle download button click if (modalDownloadBtn) { modalDownloadBtn.addEventListener('click', async function(e) { e.preventDefault(); const type = this.dataset.type; // Use the original Pinterest URL, not the direct content URL if (!currentPinterestUrl) { alert('Download URL not available'); return; } // Show loading state const originalText = modalDownloadText.textContent; modalDownloadText.textContent = 'Downloading...'; modalDownloadBtn.disabled = true; try { // Use the download API endpoint with original Pinterest URL const response = await fetch('api/download.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: currentPinterestUrl }) }); if (!response.ok) { const errorData = await response.json().catch(() => ({})); throw new Error(errorData.error || 'Download failed'); } const blob = await response.blob(); // Determine filename and extension let ext = 'jpg'; if (type === 'video') ext = 'mp4'; else if (type === 'gif') ext = 'gif'; else if (this.dataset.url && this.dataset.url.includes('.png')) ext = 'png'; else if (this.dataset.url && this.dataset.url.includes('.webp')) ext = 'webp'; const filename = `pinterest_${Date.now()}.${ext}`; // Create download link const downloadUrl = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = downloadUrl; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); window.URL.revokeObjectURL(downloadUrl); modalDownloadText.textContent = 'Downloaded!'; setTimeout(() => { modalDownloadText.textContent = originalText; }, 2000); } catch (error) { console.error('Download error:', error); alert('Download failed: ' + error.message); modalDownloadText.textContent = originalText; } finally { modalDownloadBtn.disabled = false; } }); } })(); // Close nested IIFE } // Close initApp function // Initialize app if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initApp); } else { initApp(); } })(); // Close outer IIFE