Connect Bolt.new to Vimeo's REST API to fetch video metadata as JSON, embed videos, and build video gallery pages. For quick embeds without authentication, use Vimeo's OEmbed endpoint — no API key needed. For private videos, upload management, and analytics, get a personal access token from the Vimeo Developer Dashboard and use a Next.js API route to proxy calls. Vimeo's API returns standard JSON and works fully in Bolt's WebContainer.
Build Vimeo-Powered Video Experiences in Bolt.new
Vimeo's API is one of the most developer-friendly video APIs available — it returns clean JSON, has comprehensive documentation, and provides both unauthenticated OEmbed endpoints and a full REST API with OAuth. The fact that the search queries specifically include 'vimeo json integration' and 'connect vimeo to json' shows that developers primarily want to fetch Vimeo data programmatically and use it in their apps, not just embed iframes manually.
The OEmbed endpoint is the fastest path to video embeds: send a GET request to `https://vimeo.com/api/oembed.json?url=https://vimeo.com/VIDEO_ID` and get back a complete embed HTML snippet, thumbnail URL, video title, description, and dimensions — no API key required. This endpoint works from any origin and is perfect for public videos you want to embed without setting up OAuth.
For private videos, batch fetching from a user's portfolio, or accessing video analytics (plays, likes, comments), you need a personal access token from the Vimeo Developer Dashboard. The full REST API (`api.vimeo.com`) requires a Bearer token and has CORS restrictions for client-side calls — use a Next.js API route to proxy these calls server-side. The Vimeo API is entirely HTTP-based with no native modules required, so it works perfectly in Bolt.new's WebContainer for development.
Integration method
Vimeo's API is fully REST-based and returns JSON, making it a natural fit for Bolt.new's WebContainer. The OEmbed endpoint works without authentication for public video embeds. For private video data and management features, use a personal access token stored in environment variables and proxied through a Next.js API route to avoid CORS issues. Large video uploads require a deployed server environment — not the WebContainer.
Prerequisites
- A Vimeo account — free or paid (some API features require Vimeo Pro or higher)
- A Vimeo personal access token from developer.vimeo.com — create an app, then generate a token with the scopes public, private, and video_files
- A Bolt.new account with a new Next.js project open
- Your Vimeo user ID (find it in your Vimeo account URL or via the API at api.vimeo.com/me)
Step-by-step guide
Set up Vimeo API credentials and understand the two access patterns
Set up Vimeo API credentials and understand the two access patterns
Vimeo's API has two usage patterns with different authentication requirements. Understanding the difference helps you choose the right approach for your use case. The OEmbed pattern requires no credentials at all. Send a GET request to `https://vimeo.com/api/oembed.json?url=https://vimeo.com/YOUR_VIDEO_ID` and receive JSON with the complete embed code, thumbnail URL, video title, author name, and dimensions. This is public and works from any client or server — perfect for embedding known public videos without setting up API keys. The REST API pattern requires a personal access token for private videos, user-specific data, and higher rate limits. Go to developer.vimeo.com, log in, and create an app. Under 'Personal Access Tokens', generate a token with the scopes you need: `public` (public videos), `private` (private videos), `video_files` (direct video file URLs for download), and `interact` (likes, comments). The token is a long string starting with a series of numbers — copy it immediately as you cannot view it again after the page closes. Your Vimeo user ID is the number in your profile URL (`vimeo.com/USER_ID`). You can also find it by calling `api.vimeo.com/me` with your token. Add both to your .env.local file. Do not commit these to version control. Note on rate limits: unauthenticated OEmbed calls are limited per IP. Authenticated API calls have higher limits (1,000 requests per minute on Pro plans). For high-traffic apps, cache API responses rather than fetching fresh data on every page load.
Set up my Next.js project for Vimeo integration. Create a .env.local file with: VIMEO_ACCESS_TOKEN=your_token_here, VIMEO_USER_ID=your_user_id_here. Create a lib/vimeo.ts file that exports a vimeoFetch helper function that calls the Vimeo API at https://api.vimeo.com with the Bearer token from process.env.VIMEO_ACCESS_TOKEN and returns parsed JSON. Add error handling for non-200 responses.
Paste this in Bolt.new chat
1// lib/vimeo.ts2const VIMEO_API_BASE = 'https://api.vimeo.com';34export interface VimeoVideo {5 uri: string;6 name: string;7 description: string | null;8 duration: number;9 width: number;10 height: number;11 created_time: string;12 stats: { plays: number };13 pictures: {14 sizes: Array<{ width: number; height: number; link: string; link_with_play_button: string }>;15 };16 embed: { html: string };17 link: string;18}1920export interface VimeoCollection {21 total: number;22 page: number;23 per_page: number;24 paging: { next: string | null; previous: string | null };25 data: VimeoVideo[];26}2728export async function vimeoFetch<T>(path: string): Promise<T> {29 const token = process.env.VIMEO_ACCESS_TOKEN;30 if (!token) throw new Error('VIMEO_ACCESS_TOKEN is not set');3132 const url = path.startsWith('http') ? path : `${VIMEO_API_BASE}${path}`;33 const response = await fetch(url, {34 headers: {35 'Authorization': `Bearer ${token}`,36 'Accept': 'application/vnd.vimeo.*+json;version=3.4',37 'Content-Type': 'application/json',38 },39 next: { revalidate: 300 }, // Cache for 5 minutes in Next.js40 });4142 if (response.status === 401) {43 throw new Error('Invalid Vimeo access token');44 }45 if (response.status === 404) {46 throw new Error('Vimeo resource not found');47 }48 if (!response.ok) {49 const error = await response.json().catch(() => ({ error: 'Unknown error' }));50 throw new Error(error.error ?? `Vimeo API error: ${response.status}`);51 }5253 return response.json();54}5556export function getThumbnail(video: VimeoVideo, preferredWidth = 640): string {57 const sizes = video.pictures.sizes;58 const closest = sizes.reduce((prev, curr) =>59 Math.abs(curr.width - preferredWidth) < Math.abs(prev.width - preferredWidth) ? curr : prev60 );61 return closest.link_with_play_button ?? closest.link;62}6364export function formatDuration(seconds: number): string {65 const m = Math.floor(seconds / 60);66 const s = seconds % 60;67 return `${m}:${s.toString().padStart(2, '0')}`;68}Pro tip: Vimeo's Accept header version `application/vnd.vimeo.*+json;version=3.4` is important — without it you may receive older API response formats. Always include this header in Vimeo API requests.
Expected result: A configured Vimeo helper library in lib/vimeo.ts with typed interfaces, error handling, and a 5-minute cache using Next.js fetch caching.
Build the OEmbed endpoint for instant video embeds
Build the OEmbed endpoint for instant video embeds
The OEmbed approach is the fastest way to embed Vimeo videos in your Bolt app. Create a Next.js API route that proxies OEmbed requests to avoid browser CORS restrictions on direct client-side calls. The Vimeo OEmbed endpoint supports useful parameters: `width` and `height` to constrain embed dimensions, `autoplay=1` to start playing on load, `loop=1` for looping, and `title=0` to hide the video title overlay. The OEmbed response contains a complete iframe embed code in the `html` field. You can render this directly using `dangerouslySetInnerHTML` in React — this is safe because the HTML comes from Vimeo's trusted OEmbed endpoint, not user input. The response also includes the thumbnail URL, video title, author name, and the original video dimensions which you need to calculate the aspect ratio. For responsive embeds, do not use the hardcoded width and height from the iframe HTML. Instead, wrap the embed in a container div with `padding-bottom: 56.25%` (for 16:9) and `position: relative`, then set the iframe to `position: absolute; inset: 0; width: 100%; height: 100%`. This technique (the intrinsic ratio trick) makes the embed scale with the container without JavaScript. For performance, avoid calling OEmbed on every page render. If you know the Vimeo video IDs in advance, pre-fetch the OEmbed data at build time using Next.js static generation and cache the results.
Create a Vimeo OEmbed API route at app/api/vimeo/oembed/route.ts that accepts a GET request with a 'url' query parameter (e.g., https://vimeo.com/76979871), calls https://vimeo.com/api/oembed.json with width=1280 param, and returns the oembed JSON. Then create a VimeoEmbed React component that accepts a vimeoUrl prop, fetches the oembed data from the API route, and renders a responsive 16:9 aspect ratio embed using the html field with dangerouslySetInnerHTML. Show a loading skeleton while fetching and a fallback thumbnail if the embed fails.
Paste this in Bolt.new chat
1// app/api/vimeo/oembed/route.ts2import { NextRequest, NextResponse } from 'next/server';34export async function GET(request: NextRequest) {5 const videoUrl = request.nextUrl.searchParams.get('url');67 if (!videoUrl || !videoUrl.includes('vimeo.com')) {8 return NextResponse.json({ error: 'Valid Vimeo URL required' }, { status: 400 });9 }1011 const oembedUrl = new URL('https://vimeo.com/api/oembed.json');12 oembedUrl.searchParams.set('url', videoUrl);13 oembedUrl.searchParams.set('width', '1280');14 oembedUrl.searchParams.set('responsive', 'true');1516 const response = await fetch(oembedUrl.toString(), {17 next: { revalidate: 3600 }, // Cache OEmbed responses for 1 hour18 });1920 if (!response.ok) {21 return NextResponse.json(22 { error: 'Video not found or not embeddable' },23 { status: response.status }24 );25 }2627 const data = await response.json();28 return NextResponse.json(data);29}3031// app/components/VimeoEmbed.tsx32'use client';33import { useState, useEffect } from 'react';3435interface OEmbedData {36 html: string;37 title: string;38 thumbnail_url: string;39 width: number;40 height: number;41 author_name: string;42}4344export function VimeoEmbed({ vimeoUrl, className = '' }: { vimeoUrl: string; className?: string }) {45 const [oembed, setOembed] = useState<OEmbedData | null>(null);46 const [loading, setLoading] = useState(true);47 const [error, setError] = useState(false);4849 useEffect(() => {50 fetch(`/api/vimeo/oembed?url=${encodeURIComponent(vimeoUrl)}`)51 .then(r => r.json())52 .then(data => {53 if (data.error) throw new Error(data.error);54 setOembed(data);55 })56 .catch(() => setError(true))57 .finally(() => setLoading(false));58 }, [vimeoUrl]);5960 if (loading) return (61 <div className={`bg-gray-900 animate-pulse rounded-lg aspect-video ${className}`} />62 );6364 if (error || !oembed) return (65 <div className={`bg-gray-900 rounded-lg aspect-video flex items-center justify-center ${className}`}>66 <p className="text-gray-400 text-sm">Video unavailable</p>67 </div>68 );6970 return (71 <div72 className={`relative aspect-video rounded-lg overflow-hidden ${className}`}73 dangerouslySetInnerHTML={{ __html: oembed.html }}74 />75 );76}Pro tip: Pass `responsive=true` in the OEmbed request to get Vimeo's built-in responsive iframe HTML, which includes the padding-bottom intrinsic ratio CSS in an inline style. This is cleaner than implementing the aspect ratio wrapper yourself.
Expected result: A VimeoEmbed component that renders responsive Vimeo iframes from a URL prop, with loading skeleton and error fallback states.
Build the video library API routes with pagination
Build the video library API routes with pagination
Fetching a user's video library requires the authenticated REST API. The Vimeo API uses cursor-based pagination via the `paging.next` field in responses — when you have more videos than the per_page limit, `paging.next` contains a URL for the next page. Implement this pagination so your gallery can display large video collections. The key endpoint for fetching user videos is `GET /users/{user_id}/videos`. Add query parameters to control the response: `fields` to request only the data you need (reduces response size significantly), `per_page` for the page size (max 100), `page` for pagination, and `sort` with `date` or `plays` to control ordering. Using the `fields` parameter is crucial for performance. Without it, Vimeo returns all metadata for every video including file download URLs, review links, tags, and embed codes for every size. A response for 20 videos without field filtering can be 50-100KB. With `fields=uri,name,description,duration,pictures.sizes,stats.plays,embed.html,link`, the same response is under 10KB. For the gallery UI, display a 2-3 column responsive grid with thumbnail cards. Each card shows the thumbnail with a play button overlay, video title, duration, and view count. Clicking a card opens the full embed in a modal or navigates to a detail page. Add 'Load More' pagination rather than infinite scroll — it is simpler to implement and better for users on slower connections.
Create API routes for the Vimeo video library. First: GET /api/vimeo/videos route that fetches videos from process.env.VIMEO_USER_ID using vimeoFetch from lib/vimeo.ts. Accept page and per_page query params (default per_page=12). Request only fields: uri,name,description,duration,created_time,stats.plays,pictures.sizes,embed.html,link. Return the data array and paging info. Second: GET /api/vimeo/videos/[videoId] route that fetches a single video by ID. Then build a video gallery page with a responsive 3-column grid of video cards. Each card shows the 640px thumbnail, video name, formatted duration, and play count. Add a Load More button that fetches the next page and appends to the grid.
Paste this in Bolt.new chat
1// app/api/vimeo/videos/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { vimeoFetch, VimeoCollection } from '@/lib/vimeo';45const FIELDS = [6 'uri', 'name', 'description', 'duration', 'created_time',7 'stats.plays', 'pictures.sizes', 'embed.html', 'link', 'width', 'height',8].join(',');910export async function GET(request: NextRequest) {11 const page = request.nextUrl.searchParams.get('page') ?? '1';12 const perPage = Math.min(13 parseInt(request.nextUrl.searchParams.get('per_page') ?? '12'),14 10015 );16 const userId = process.env.VIMEO_USER_ID;1718 if (!userId) {19 return NextResponse.json({ error: 'VIMEO_USER_ID not configured' }, { status: 500 });20 }2122 try {23 const data = await vimeoFetch<VimeoCollection>(24 `/users/${userId}/videos?fields=${FIELDS}&per_page=${perPage}&page=${page}&sort=date`25 );26 return NextResponse.json(data);27 } catch (error) {28 const message = error instanceof Error ? error.message : 'Unknown error';29 return NextResponse.json({ error: message }, { status: 500 });30 }31}Pro tip: Vimeo video URIs are in the format '/videos/123456789'. Extract the numeric ID from the URI with uri.split('/').pop() when you need to construct embed URLs or deep links. The video ID is the last segment of the URI path.
Expected result: Paginated video library API that returns typed video data with thumbnails and embed code, powering a gallery page with Load More pagination.
Deploy to Netlify and configure environment variables
Deploy to Netlify and configure environment variables
The Vimeo integration is fully functional in Bolt.new's WebContainer for development — all outbound API calls to Vimeo's REST endpoint and OEmbed work in the preview. When you are ready for production, deploy to Netlify or Bolt Cloud. In Bolt.new, click the Deploy button and connect to Netlify via OAuth. Bolt will build your Next.js project and deploy it automatically. After the initial deployment, go to Netlify's dashboard → Site Configuration → Environment Variables and add `VIMEO_ACCESS_TOKEN` and `VIMEO_USER_ID`. Trigger a redeploy (Deploys → Trigger deploy) to make the variables available. One Bolt.new WebContainer limitation worth noting: for video uploads to Vimeo, the standard Vimeo upload flow requires reading large binary files from disk and streaming them to Vimeo's upload API. The WebContainer's ephemeral in-memory file system is not suitable for large file handling — files exist only in memory during the session and there is no persistent local storage. For video upload features, implement them after deployment where a real server environment can handle large file streams. Use multipart form data and stream the file directly to Vimeo's upload endpoint without reading the entire file into memory. For private videos, ensure your Vimeo access token has the `private` scope. Videos set to 'Only me' or 'Password protected' in Vimeo require this scope; otherwise the API returns 404 for those video IDs even when the correct token is provided.
Add Vimeo video detail pages to my app. Create a dynamic route at app/video/[videoId]/page.tsx that fetches a single video from /api/vimeo/videos/[videoId], shows the full embed player at the top, video title, description, view count, duration, and a related videos section showing 3 more videos from the same user. Add a back button to return to the gallery. Ensure the embed is responsive at 16:9 aspect ratio.
Paste this in Bolt.new chat
1// netlify.toml2[build]3 command = "npm run build"4 publish = ".next"56[[plugins]]7 package = "@netlify/plugin-nextjs"89[build.environment]10 NODE_VERSION = "20"1112# Cache Vimeo thumbnails aggressively13[[headers]]14 for = "/api/vimeo/*"15 [headers.values]16 Cache-Control = "s-maxage=300, stale-while-revalidate=60"Pro tip: Vimeo generates thumbnail images in multiple sizes. The `pictures.sizes` array contains objects with width, height, and link fields. Use the 640px variant for gallery thumbnails and the 1280px variant for the video detail page header. Avoid requesting the original 1920px thumbnail for thumbnails — it unnecessarily slows page load.
Expected result: A deployed Vimeo-powered video gallery on Netlify with paginated grid, individual video detail pages, and OEmbed player rendering.
Common use cases
Video Portfolio Gallery
Fetch all videos from a Vimeo user account and display them in a responsive masonry or grid gallery with thumbnails, titles, view counts, and click-to-play modals. Perfect for creative professionals or agencies showcasing their work.
Build a Vimeo video portfolio gallery in Next.js. Create an API route at /api/vimeo/videos that fetches all videos from a Vimeo user ID (from env var VIMEO_USER_ID) using a personal access token (VIMEO_ACCESS_TOKEN). Return each video's id, name, description, duration, pictures.sizes (thumbnails), stats.plays, and embed.html. Display a responsive 3-column grid of video thumbnail cards. When clicked, show a modal with the Vimeo embed player. Use Tailwind CSS with a dark cinema-style theme.
Copy this prompt to try it in Bolt.new
Client Video Delivery Portal
A private portal where clients log in to view their commissioned videos stored in a specific Vimeo folder or album. Fetch videos by album ID, display them in a clean player interface, and show metadata like delivery date and video specs.
Create a client video delivery portal in Next.js. Add an API route at /api/vimeo/album/[albumId] that fetches all videos in a specific Vimeo album using a personal access token. Build a portal page that shows video thumbnails in a list with title, duration, and creation date. When a client clicks a video, expand an embedded Vimeo player inline using the video's embed.html. Add a search input to filter videos by title client-side. Use process.env.VIMEO_ACCESS_TOKEN for the Bearer token.
Copy this prompt to try it in Bolt.new
Blog with Embedded Video Posts
Add rich video embeds to blog posts by fetching Vimeo OEmbed data for video URLs stored in content. The OEmbed endpoint requires no API key, making it ideal for content-driven sites where authors just paste Vimeo URLs into their posts.
Add Vimeo OEmbed support to my blog. Create an API route at /api/vimeo/oembed that accepts a Vimeo video URL as a query param, fetches the OEmbed data from https://vimeo.com/api/oembed.json, and returns the embed HTML, thumbnail URL, title, author name, and video dimensions. Create a VimeoEmbed React component that accepts a Vimeo URL prop, calls this API route, and renders a responsive embedded player (aspect ratio 16:9). Handle loading and error states gracefully.
Copy this prompt to try it in Bolt.new
Troubleshooting
Vimeo API returns 401 Unauthorized even with a valid-looking access token
Cause: The personal access token either expired, was deleted from the Vimeo Developer Dashboard, or does not have the required scope for the endpoint being accessed. Vimeo tokens do not automatically expire but can be revoked.
Solution: Go to developer.vimeo.com → your app → Personal Access Tokens and check if the token still exists. If it was deleted, generate a new one with the required scopes (public, private, video_files). Update VIMEO_ACCESS_TOKEN in your .env.local and in Netlify's environment variables, then redeploy.
Vimeo embed HTML renders as plain text (the iframe code shows as literal text, not a player)
Cause: The embed.html field contains raw HTML with the iframe tag, but React's default JSX rendering escapes HTML for security. Rendering it as {oembed.html} shows the literal string rather than interpreting it as HTML.
Solution: Use dangerouslySetInnerHTML to render Vimeo's embed HTML. This is safe for content from Vimeo's trusted OEmbed endpoint but should never be used with user-generated content.
1// WRONG - renders as escaped text:2<div>{video.embed.html}</div>34// CORRECT - renders as actual iframe:5<div dangerouslySetInnerHTML={{ __html: video.embed.html }} />Private Vimeo videos return 404 even though they exist in the Vimeo account
Cause: The access token was generated without the 'private' scope. Videos set to 'Only me' or with restricted viewing permissions return 404 rather than 403 for unauthorized requests — this is intentional to avoid information leakage.
Solution: Generate a new personal access token with the 'private' scope checked. You cannot add scopes to an existing token — delete the old one and create a new one. Update VIMEO_ACCESS_TOKEN and redeploy.
Gallery grid loads slowly on the initial page render with many videos
Cause: Each video card is making a separate fetch request for OEmbed data, causing N+1 requests on page load. With 20 videos, this is 20 simultaneous API calls causing visible layout shift and slow rendering.
Solution: Pre-fetch the thumbnail data in the API route using the pictures.sizes field from the main videos endpoint, rather than making separate OEmbed calls per card. Reserve OEmbed calls only for when a user clicks to play a video, not for the thumbnail grid.
1// In the gallery, use pictures.sizes from the videos endpoint for thumbnails2// Only fetch OEmbed when the user clicks to play:3function VideoCard({ video }: { video: VimeoVideo }) {4 const [showEmbed, setShowEmbed] = useState(false);5 const thumbnail = getThumbnail(video, 640); // From lib/vimeo.ts67 return (8 <div onClick={() => setShowEmbed(true)}>9 {showEmbed10 ? <VimeoEmbed vimeoUrl={video.link} /> // Fetches oembed only on click11 : <img src={thumbnail} alt={video.name} /> // Uses pre-fetched thumbnail12 }13 </div>14 );15}Best practices
- Use the fields parameter in every Vimeo API request to limit response size — requesting only the fields you need reduces payload by up to 90% for video-heavy pages
- Cache Vimeo API responses using Next.js fetch caching (next: { revalidate: 300 }) — Vimeo video metadata changes infrequently and does not need fresh fetches on every request
- Store VIMEO_ACCESS_TOKEN only in server-side environment variables and never in NEXT_PUBLIC_ prefixed vars — the token provides access to your private Vimeo account
- Use the OEmbed endpoint for simple public video embeds rather than the authenticated API — it requires no credentials, has generous rate limits, and provides ready-to-use responsive embed HTML
- Handle the case where pictures.sizes is empty or the embed HTML is unavailable — some videos may have privacy settings that prevent embedding outside of Vimeo
- Implement 'Load More' pagination rather than loading all videos at once — a portfolio with 100+ videos should never load all metadata on the initial page render
- For video upload features, always implement them on a deployed server (Netlify or Bolt Cloud) rather than in Bolt's WebContainer preview — large file handling requires a persistent file system
- Add the Vimeo video ID to image alt text and page titles for SEO — search engines can index Vimeo-powered pages if you provide proper text metadata alongside the embed
Alternatives
YouTube has a vastly larger audience and free hosting with no storage limits, making it better for public-facing video content that benefits from YouTube's discovery algorithm.
Spotify is for music and audio streaming rather than video hosting — choose Spotify when your content is audio-only and you want music catalog integration.
SoundCloud focuses on audio content and music sharing, suited for apps built around music community features rather than professional video hosting.
Pixabay provides royalty-free stock video clips rather than user-uploaded content hosting — better for apps needing background videos or stock footage without hosting your own content.
Frequently asked questions
Can I connect Vimeo to JSON in Bolt.new without authentication?
Yes, using Vimeo's OEmbed endpoint at vimeo.com/api/oembed.json. Pass any public Vimeo URL as the 'url' parameter and receive JSON with the embed code, thumbnail URL, video title, and dimensions — no API key required. For private videos, user libraries, and analytics data, you need a personal access token from the Vimeo Developer Dashboard.
How do I get Vimeo video data as JSON in my Bolt.new app?
Create a Next.js API route that calls the Vimeo REST API at api.vimeo.com with a Bearer token from your environment variables. The API returns JSON for all endpoints — video details, user libraries, albums, and analytics. Use the fields parameter to request only the JSON keys you need, which dramatically reduces response size for video-heavy pages.
Does Vimeo video embedding work in Bolt.new's WebContainer preview?
Yes. Vimeo iframes and the OEmbed endpoint work in Bolt's WebContainer preview — these are purely client-side browser features with no WebContainer restrictions. You can develop and test Vimeo embeds entirely in the Bolt preview. API route calls to the Vimeo REST API also work in the preview since they are outbound HTTP requests.
Can I upload videos to Vimeo from my Bolt.new app?
Vimeo supports file uploads via its API, but this is best implemented on a deployed server rather than in Bolt's WebContainer. The WebContainer has an ephemeral in-memory file system with no persistent storage — large file uploads can exceed browser memory limits. Deploy to Netlify or Bolt Cloud first, then implement the upload flow using Vimeo's tus-based upload protocol.
Do I need a paid Vimeo plan to use the API?
A free Vimeo account provides basic API access for fetching public video data and OEmbed. However, free accounts have storage limits (500MB/week), and some API features like private video access and advanced analytics require a Vimeo Pro plan ($20/month). The personal access token is available on all plan levels.
How do I make Vimeo embeds responsive in my Bolt.new app?
Pass responsive=true in the OEmbed request to get Vimeo's built-in responsive embed HTML. Alternatively, wrap the embed div in a container with a 16:9 aspect ratio using Tailwind's aspect-video class or CSS padding-bottom: 56.25%. Set the iframe inside to width: 100% and height: 100% with absolute positioning. The VimeoEmbed component in this tutorial implements both approaches.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation