Connect Retool to Vimeo by creating a REST API Resource with Vimeo's API base URL (https://api.vimeo.com) and your personal access token or OAuth 2.0 credentials. Build queries to browse videos, manage folders, control privacy settings, and view analytics — creating a video asset management dashboard for content teams that need more operational control than Vimeo's native interface provides.
| Fact | Value |
|---|---|
| Tool | Vimeo |
| Category | Social |
| Method | REST API Resource |
| Difficulty | Intermediate |
| Time required | 20 minutes |
| Last updated | April 2026 |
Why Connect Retool to Vimeo?
Content teams managing large Vimeo video libraries often need operational tools that go beyond what Vimeo's native web interface offers. Searching across hundreds of videos, bulk-updating privacy settings, auditing which videos are missing thumbnails or descriptions, or comparing view performance across a portfolio of videos requires either tedious manual navigation or API access. A Retool Vimeo integration gives content operations teams a custom panel that surfaces exactly the data and actions they need without navigating Vimeo's general-purpose UI.
For marketing and content teams, connecting Vimeo to Retool enables dashboards that combine video analytics (plays, impressions, engagement rate) with business context from other sources. You can join Vimeo video performance data with campaign data from your CRM, or map video titles to products in your e-commerce database, creating cross-system reports that Vimeo's native analytics cannot produce. Privacy and access control management — setting videos to private, unlisted, or password-protected, or embedding with domain restrictions — can be handled in bulk through Retool rather than visiting each video's settings page individually.
Vimeo's API requires no special enterprise tier for basic access — any Vimeo Pro, Business, or Premium account can generate a personal access token or create an OAuth app. This makes the integration accessible to content teams without negotiating enterprise API contracts, and Retool's server-side proxying ensures your Vimeo API credentials are never exposed in the browser regardless of who accesses the dashboard.
Integration method
Vimeo provides a comprehensive REST API at https://api.vimeo.com that supports OAuth 2.0 and personal access tokens for authentication. Retool connects by creating a REST API Resource with Vimeo's base URL and a Bearer token (either a personal access token or OAuth 2.0 access token), then building visual queries in the query editor to list videos, manage folders, update privacy settings, and pull view analytics. All API requests are proxied server-side through Retool, keeping credentials secure. You can combine Vimeo data with your CMS, DAM, or marketing data in a unified content operations panel.
Prerequisites
- A Vimeo account on the Pro, Business, or Premium plan (required for API access)
- A Vimeo personal access token or OAuth 2.0 app credentials from https://developer.vimeo.com/apps
- The OAuth app must have at least the 'public', 'private', 'video_files', 'stats', and 'edit' scopes enabled for full read/write access
- A Retool account (Cloud or self-hosted) with permission to add Resources
- Basic familiarity with the Retool app builder — query editor and Table/Chart components
Step-by-step guide
Create a Vimeo app and generate an access token
Navigate to Vimeo's developer portal at https://developer.vimeo.com/apps. If you do not already have an app, click New App. Fill in the app name (e.g., 'Retool Dashboard'), description ('Internal Retool integration for video management'), and set the App URL to your Retool instance URL. Select 'I will be interacting with Vimeo's API but won't be performing any financial transactions' for the app purpose, which gives you access to standard API features without requiring app review. Once the app is created, you will land on the app's Settings page. Navigate to the Authentication tab. Here you have two options for obtaining credentials: Option A — Personal Access Token (recommended for single-account dashboards): Click Generate token in the Personal Access Tokens section. In the scope selection, check all required permissions: public (read public videos), private (read private videos), edit (update video metadata), video_files (access video files), and stats (read analytics). Click Generate. Copy the generated token immediately — it will not be displayed again. Option B — OAuth 2.0 (recommended if multiple users will authenticate with their own Vimeo accounts): Note your Client ID and Client Secret from the Authentication tab. Configure OAuth in Retool's resource using these credentials and Vimeo's authorization URL (https://api.vimeo.com/oauth/authorize) and token URL (https://api.vimeo.com/oauth/access_token). For most team dashboards, a personal access token from a shared Vimeo account is simpler and does not require OAuth consent flows.
Pro tip: Personal access tokens on Vimeo do not expire automatically unless revoked. Store the token securely — if it is ever compromised, revoke it immediately in the Vimeo developer portal and generate a new one.
Expected result: You have a Vimeo personal access token or OAuth credentials ready to configure in Retool.
Create a REST API Resource in Retool for Vimeo
In Retool, navigate to Settings (gear icon) → Configuration Variables. Click Add Variable, name it VIMEO_ACCESS_TOKEN, paste your personal access token as the value, check the 'Secret' checkbox, and click Save. Now go to the Resources tab in the Retool sidebar. Click Add Resource, type 'REST' in the search, and select REST API. In the configuration form: - Name: 'Vimeo API' - Base URL: https://api.vimeo.com In the Authentication section, select 'Bearer Token' from the Authentication dropdown. In the Token field, enter {{ retoolContext.configVars.VIMEO_ACCESS_TOKEN }}. In the Headers section, add: - Accept: application/vnd.vimeo.*+json;version=3.4 - Content-Type: application/json The Accept header is important — it tells Vimeo's API which version to use and requests JSON responses. Without it, you may receive XML or unexpected content types. Click Save Changes. Your Vimeo resource is ready. Test it immediately by creating a quick query: Method GET, Path /me — this fetches your Vimeo account details and confirms authentication is working.
Pro tip: The Vimeo API version header (application/vnd.vimeo.*+json;version=3.4) pins your integration to API version 3.4, preventing breaking changes from new API versions from affecting your Retool queries. Update the version number intentionally when you want to adopt API changes.
Expected result: The Vimeo API resource appears in your Resources list. A GET /me query returns your Vimeo account name and details, confirming authentication works.
Build a query to list videos from your Vimeo account
Open or create a Retool app. In the Code panel, click + to add a new query. Select your Vimeo API resource from the Resource dropdown. Configure: - Method: GET - Path: /me/videos (lists all videos for the authenticated user; use /users/{user_id}/videos for a specific user) - Query Parameters: - per_page: {{ pagination.pageSize || 25 }} - page: {{ pagination.page || 1 }} - fields: 'uri,name,description,duration,created_time,modified_time,stats,privacy,link,pictures,tags' — this limits the response to only needed fields, significantly reducing response size - sort: 'modified_time' — sort by most recently modified - direction: 'desc' - query: {{ searchInput.value || '' }} — enables server-side video title search In the Advanced tab, add a JavaScript transformer to reshape the Vimeo response. Vimeo's video list response wraps results in a 'data' key with pagination metadata in the root object. Set the query to run automatically when inputs change and name it 'videosQuery'. Drag a Table component onto the canvas. Set Data to {{ videosQuery.data }}. Configure columns: thumbnail (image type using the thumbnail URL), title, privacy, duration, plays, created_date. Set the Table's pageSize to 25 and enable server-side pagination by binding the Table's pagination to your pagination variables.
1// Transformer to normalize Vimeo videos list response2const response = data;3const videos = response.data || [];4return videos.map(v => {5 // Extract the video ID from the URI (format: /videos/12345)6 const videoId = v.uri ? v.uri.split('/').pop() : null;7 // Get the largest thumbnail image8 const thumbnails = (v.pictures && v.pictures.sizes) ? v.pictures.sizes : [];9 const thumb = thumbnails.length > 0 ? thumbnails[Math.min(3, thumbnails.length - 1)].link : '';10 return {11 videoId: videoId,12 title: v.name || '(Untitled)',13 description: v.description || '',14 duration: v.duration ? Math.floor(v.duration / 60) + ':' + String(v.duration % 60).padStart(2, '0') : 'N/A',15 privacy: v.privacy ? v.privacy.view : 'unknown',16 plays: v.stats ? v.stats.plays || 0 : 0,17 likes: v.stats ? v.stats.likes || 0 : 0,18 createdDate: v.created_time ? new Date(v.created_time).toLocaleDateString() : 'N/A',19 modifiedDate: v.modified_time ? new Date(v.modified_time).toLocaleDateString() : 'N/A',20 thumbnail: thumb,21 vimeoUrl: v.link || '',22 tags: (v.tags || []).map(t => t.name).join(', ') || 'No tags'23 };24});Pro tip: Use the 'fields' query parameter to limit which fields Vimeo returns. Fetching all fields for large video libraries significantly increases response time. Only request the fields you display — this can cut response size by 80% for large accounts.
Expected result: A Table in your Retool app displays Vimeo videos with thumbnail images, title, privacy status, play count, and creation date. The search input filters videos by title, and pagination navigates through the full library.
Update video metadata and privacy settings from a Retool form
To allow content managers to update video metadata directly from Retool, create a detail panel that appears when a video is selected in the table and provides a form for editing the title, description, privacy setting, and tags. Drag a Container component onto the canvas below the video table. Inside the container, add: - A TextInput for the video title, with default value {{ videosTable.selectedRow.title }} - A TextArea for the description, with default value {{ videosTable.selectedRow.description }} - A Select component for privacy setting, with options: { label: 'Public', value: 'anybody' }, { label: 'Private', value: 'nobody' }, { label: 'Unlisted', value: 'unlisted' }, { label: 'Password Protected', value: 'password' }. Set default to {{ videosTable.selectedRow.privacy }}. - A TextInput for tags (comma-separated) - A Save Changes button Create a new query for the update operation: - Method: PATCH - Path: /videos/{{ videosTable.selectedRow.videoId }} - Body type: JSON Set the query Trigger to Manual. Wire the Save Changes button's Click event handler to trigger this PATCH query. Add a Success event handler that re-runs the videos list query to refresh the table with the updated values, and shows a success notification. Add a Failure event handler that shows an error notification with {{ updateVideoQuery.error.message }}.
1{2 "name": "{{ titleInput.value }}",3 "description": "{{ descriptionInput.value }}",4 "privacy": {5 "view": "{{ privacySelect.value }}"6 },7 "tags": {{ tagsInput.value ? JSON.stringify(tagsInput.value.split(',').map(t => t.trim()).filter(t => t)) : '[]' }}8}Pro tip: Add a 'Hide detail form when no row is selected' condition to the Container component using its visibility setting: {{ videosTable.selectedRow.videoId !== undefined }}. This prevents the empty form from showing when no video is selected, keeping the UI clean.
Expected result: Selecting a video row populates the detail form with that video's current metadata. Editing the form fields and clicking Save sends a PATCH request to Vimeo. The table refreshes and shows the updated title and privacy setting.
Fetch video analytics and build a performance chart
Vimeo's API provides video-level statistics and more detailed analytics for Business and Premium accounts. Create a statistics query and a bar chart to visualize video performance across your library. For basic statistics (available on all plans), your videos transformer already extracts plays and likes from the stats field in the /me/videos response. Use this data to build a Chart component that shows the top videos by play count. Drag a Chart component from the Component panel onto the canvas. In the Chart's configuration: - Chart type: Bar (horizontal recommended for video titles which are long) - Data: {{ videosQuery.data }} - X axis: 'plays' - Y axis: 'title' - Sort the data in a transformer before passing to the chart: sort by plays descending and take the top 10 For more detailed analytics (Business/Premium plans), Vimeo provides the /videos/{video_id}/stats endpoint which returns time-series data. Create an analytics query when a video row is selected: - Method: GET - Path: /videos/{{ videosTable.selectedRow.videoId }}/stats For the embedded video player, drag a Video component onto the canvas and set its URL to {{ 'https://player.vimeo.com/video/' + videosTable.selectedRow.videoId }}. This lets content managers preview the selected video without leaving Retool. For complex multi-resource dashboards combining Vimeo analytics with CMS or marketing data, RapidDev's team can help architect and build your Retool solution.
1// Transformer to prepare top 10 videos by play count for a Chart2const videos = videosQuery.data || [];3return videos4 .filter(v => v.plays > 0)5 .sort((a, b) => b.plays - a.plays)6 .slice(0, 10)7 .map(v => ({8 title: v.title.length > 40 ? v.title.substring(0, 40) + '...' : v.title,9 plays: v.plays,10 likes: v.likes11 }));Pro tip: Vimeo's /videos/{id}/stats endpoint may return empty data for videos with very few views or for recently uploaded videos where analytics have not yet aggregated. Always handle null or zero values gracefully in your chart transformers to avoid blank charts.
Expected result: A horizontal bar chart displays the top 10 most-played videos from your Vimeo account. An embedded video player shows the selected video from the table. The analytics panel shows play count and engagement data for the selected video.
Common use cases
Build a video library browser and metadata editor
Create a Retool dashboard that fetches all videos from a Vimeo account and displays them in a Table with thumbnail preview, title, privacy status, duration, view count, and upload date. Content managers can search and filter by folder, privacy setting, or date range. Clicking a video row opens a detail panel with a form to update the title, description, privacy setting, and tags — saving changes by calling Vimeo's PATCH endpoint directly from Retool.
Build a video library panel that fetches all Vimeo videos via the API, displays them in a Table with video thumbnail (as an image column), title, privacy, duration_seconds, stats.plays, and created_time. Add search by title filter. On row select, show a form with editable fields for name, description, and privacy (dropdown: anybody, nobody, password, unlisted, users) with a Save button that PATCHes the Vimeo API.
Copy this prompt to try it in Retool
Video analytics performance dashboard
Build a Retool analytics panel that pulls Vimeo video statistics — total plays, unique views, impressions, finish rate, and likes — and visualizes them with Charts. Content managers can select a date range and view performance trends for individual videos or compare the top 10 videos by play count using a bar chart. The dashboard replaces Vimeo's Analytics tab for teams that need to embed this data in broader marketing reports.
Build a video analytics dashboard that fetches /videos/{video_id}/stats from Vimeo API for each video in the library, aggregates total plays and finish_rate, and displays a bar Chart of top 10 videos by plays. Add a Date Range picker to filter analytics by period and show a summary KPI bar with total_plays, total_impressions, and avg_finish_rate across the portfolio.
Copy this prompt to try it in Retool
Privacy audit and bulk update panel
Create a Retool panel for security and compliance teams to audit Vimeo videos with public or unlisted privacy settings that should instead be restricted. The Table shows all videos with privacy=anybody or privacy=unlisted alongside their view count and embed domains. A 'Restrict Access' button calls the Vimeo PATCH API to set privacy=nobody or add password protection in bulk, with a confirmation modal to prevent accidental lockouts.
Build a privacy audit panel that fetches all Vimeo videos and filters to show only those with privacy.view='anybody' or privacy.view='unlisted'. Display in a Table with title, privacy_setting, plays, embed_domains. Add a checkbox column to multi-select videos and a 'Set to Password Protected' button that loops through selected videos and calls PATCH /videos/{id} with the new privacy settings.
Copy this prompt to try it in Retool
Troubleshooting
API requests return 401 Unauthorized even with a valid personal access token
Cause: The personal access token may not have the required scopes for the endpoint you are calling (e.g., accessing private videos requires the 'private' scope, updating requires the 'edit' scope). Alternatively, the token may have been regenerated or revoked in the Vimeo developer portal.
Solution: Go to your Vimeo developer app at https://developer.vimeo.com/apps, navigate to the Authentication tab, revoke the existing personal access token, and generate a new one with all required scopes explicitly checked: public, private, edit, video_files, stats. Update the Retool configuration variable with the new token.
Video list returns only 25 results even though the Vimeo account has hundreds of videos
Cause: Vimeo's API paginates results with a default of 25 items per page. Without handling pagination, only the first page is returned.
Solution: Check the response root for 'total' (total video count), 'page', and 'per_page' fields. Set the per_page parameter to the maximum allowed value (usually 100 for Vimeo). Implement Retool's server-side pagination by binding the Table's pagination variables to the query's page and per_page parameters. For fetching all videos at once (not recommended for large libraries), use a Retool Workflow with a Loop block.
PATCH request to update video privacy fails with 400 Bad Request
Cause: The request body may not match Vimeo's expected JSON structure — privacy settings must be nested inside a 'privacy' object, and the view value must be one of Vimeo's accepted values (anybody, nobody, password, users, disable, unlisted).
Solution: Verify the body structure matches Vimeo's API documentation exactly. The privacy object must be { "privacy": { "view": "nobody" } } not just { "privacy": "nobody" }. Also check that the Bearer token has the 'edit' scope — privacy updates require write permission that the 'public' scope alone does not grant.
Thumbnail images do not load in the Table component image column
Cause: Vimeo thumbnail URLs may use HTTPS but some return status 403 if the video is private and the CDN URL requires the authenticated session. Also, the thumbnail array may be empty for newly uploaded videos that have not yet generated thumbnails.
Solution: Use a larger thumbnail from the pictures.sizes array (index 3 or higher for a larger image) to ensure the URL points to a properly sized image. For private videos, the thumbnail URL may be a signed URL that expires — re-run the videos query to refresh the URLs. Add a fallback in the transformer: thumbnail || 'https://i.vimeocdn.com/video/no_thumbnail.jpg'.
Best practices
- Use the 'fields' query parameter in all Vimeo API calls to limit response payloads to only the data fields you display — large video libraries with all fields can return megabytes of unnecessary data per page.
- Store your Vimeo access token in a Retool configuration variable marked as secret to prevent it from being visible to non-admin Retool users who access the resource configuration.
- Set your video update (PATCH) queries to Manual trigger mode and add confirmation dialogs to privacy change buttons — accidentally making private videos public can be a serious security incident.
- Cache your video list query results for 5-15 minutes (Retool query caching) since video libraries change infrequently during a work session, reducing unnecessary Vimeo API calls on every page refresh.
- Use Vimeo's 'fields' parameter to fetch video thumbnails as part of the list query rather than making separate thumbnail requests — the pictures.sizes array is available in the main /me/videos response.
- Build folder-based filtering into your dashboard: create a separate query for /me/folders to let content managers browse by Vimeo folder (project) in addition to searching by title or filtering by privacy.
- For team environments, create separate personal access tokens for each connected Vimeo account (e.g., company account, team channel account) as separate Retool Resources, and add a Resource selector to your dashboard to switch between accounts.
Alternatives
Choose YouTube if your content is public-facing and discoverability through search is a priority — YouTube's API and audience reach are unmatched for public video content, while Vimeo excels at professional private hosting.
Choose Spotify if you are building a music or audio content management dashboard rather than video — Spotify's API covers track, playlist, and podcast management for audio-first teams.
Choose SoundCloud if your content is audio-focused and targets independent creators or music community audiences rather than professional video production teams.
Frequently asked questions
Does the Vimeo API require a paid plan, or does it work on the free tier?
Vimeo's API requires at least a Vimeo Pro account. Free Vimeo Basic accounts cannot create developer apps or generate API tokens. Pro, Business, and Premium plans all support API access. If you are on a free account, upgrading to Pro (the lowest paid tier) is required before you can use the integration with Retool.
Can I use Retool to upload videos directly to Vimeo?
Vimeo supports tus-based resumable uploads and standard multipart uploads via the API. While Retool can initiate the upload by calling Vimeo's POST /me/videos to create an upload link, completing the actual file upload from a browser context is complex. For video upload workflows, Vimeo's own upload widget or a direct upload from your server is more practical — use Retool to manage the post-upload metadata and privacy settings instead.
How do I filter Vimeo videos by folder or project in Retool?
Create a separate query targeting GET /me/folders (or /me/projects for older API versions) to list all your Vimeo folders. Bind the results to a Select dropdown component. When a folder is selected, change your videos query path to /me/folders/{folder_id}/videos to list only videos in that folder. This creates a folder navigation experience similar to Vimeo's native interface.
Can multiple team members authenticate with their own Vimeo accounts?
Yes, by using OAuth 2.0 instead of a personal access token. Create a Vimeo OAuth app in the developer portal, configure Retool's resource with OAuth 2.0 (setting each user to authenticate individually rather than sharing credentials), and users can connect their personal Vimeo accounts. For most internal dashboards managing a shared company Vimeo account, a single personal access token with shared credentials is simpler.
What analytics data does the Vimeo API provide compared to the native Analytics tab?
Through the API, you can access the same core metrics as Vimeo Analytics: total plays, unique viewers, impressions, finish rate, likes, comments, and downloads per video. Time-series breakdown by day, week, or month is available on Business and Premium plans via the /videos/{id}/stats endpoint. The API also exposes geographic and device breakdown data on higher-tier plans — use this to build custom analytics charts in Retool that combine Vimeo data with other business metrics.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation