Vimeo
Vimeo API integration with managed OAuth. Video hosting and sharing platform. Use this skill when users want to upload, manage, or organize videos, create showcases/albums, manage folders, or interact
Vimeo API integration with managed OAuth. Video hosting and sharing platform. Use this skill when users want to upload, manage, or organize videos, create showcases/albums, manage folders, or interact
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Access the Vimeo API with managed OAuth authentication. Upload and manage videos, create showcases and folders, manage likes and watch later, and interact with the Vimeo community.
# Get current user info python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/vimeo/me') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
https://gateway.maton.ai/vimeo/{resource}
The gateway proxies requests to
api.vimeo.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as
MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Vimeo OAuth connections at
https://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=vimeo&status=ACTIVE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'vimeo'}).encode() req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
{ "connection": { "connection_id": "a6ecb894-3148-4f4c-a54c-e9d917e3f2a9", "status": "ACTIVE", "creation_time": "2026-02-09T08:56:53.522100Z", "last_updated_time": "2026-02-09T08:58:39.407864Z", "url": "https://connect.maton.ai/?session_token=...", "app": "vimeo", "metadata": {} } }
Open the returned
url in a browser to complete OAuth authorization.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If you have multiple Vimeo connections, specify which one to use with the
Maton-Connection header:
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/vimeo/me') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', 'a6ecb894-3148-4f4c-a54c-e9d917e3f2a9') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
GET /vimeo/me
Response:
{ "uri": "/users/254399456", "name": "Chris", "link": "https://vimeo.com/user254399456", "account": "free", "created_time": "2026-02-09T07:00:20+00:00", "pictures": {...}, "metadata": { "connections": { "videos": {"uri": "/users/254399456/videos", "total": 2}, "albums": {"uri": "/users/254399456/albums", "total": 0}, "folders": {"uri": "/users/254399456/folders", "total": 0}, "likes": {"uri": "/users/254399456/likes", "total": 0}, "followers": {"uri": "/users/254399456/followers", "total": 0}, "following": {"uri": "/users/254399456/following", "total": 0} } } }
GET /vimeo/users/{user_id}
GET /vimeo/me/feed
GET /vimeo/me/videos
Response:
{ "total": 2, "page": 1, "per_page": 25, "paging": { "next": null, "previous": null, "first": "/me/videos?page=1", "last": "/me/videos?page=1" }, "data": [ { "uri": "/videos/1163160198", "name": "My Video", "description": "Video description", "link": "https://vimeo.com/1163160198", "duration": 20, "width": 1920, "height": 1080, "created_time": "2026-02-09T07:05:00+00:00" } ] }
GET /vimeo/videos/{video_id}
GET /vimeo/videos?query=nature&per_page=10
Query parameters:
query - Search queryper_page - Results per page (max 100)page - Page numbersort - Sort order: relevant, date, alphabetical, plays, likes, comments, durationdirection - Sort direction: asc, descPATCH /vimeo/videos/{video_id} Content-Type: application/json{ "name": "New Video Title", "description": "Updated description" }
DELETE /vimeo/videos/{video_id}
Returns 204 No Content on success.
GET /vimeo/me/folders
Response:
{ "total": 1, "page": 1, "per_page": 25, "data": [ { "uri": "/users/254399456/projects/28177219", "name": "My Folder", "created_time": "2026-02-09T08:59:20+00:00", "privacy": {"view": "nobody"}, "manage_link": "https://vimeo.com/user/254399456/folder/28177219" } ] }
POST /vimeo/me/folders Content-Type: application/json{ "name": "New Folder" }
PATCH /vimeo/me/projects/{project_id} Content-Type: application/json{ "name": "Renamed Folder" }
DELETE /vimeo/me/projects/{project_id}
Returns 204 No Content on success.
GET /vimeo/me/projects/{project_id}/videos
PUT /vimeo/me/projects/{project_id}/videos/{video_id}
Returns 204 No Content on success.
DELETE /vimeo/me/projects/{project_id}/videos/{video_id}
GET /vimeo/me/albums
POST /vimeo/me/albums Content-Type: application/json{ "name": "My Showcase", "description": "A collection of videos" }
Response:
{ "uri": "/users/254399456/albums/12099981", "name": "My Showcase", "description": "A collection of videos", "created_time": "2026-02-09T09:00:00+00:00" }
PATCH /vimeo/me/albums/{album_id} Content-Type: application/json{ "name": "Updated Showcase Name" }
DELETE /vimeo/me/albums/{album_id}
Returns 204 No Content on success.
GET /vimeo/me/albums/{album_id}/videos
PUT /vimeo/me/albums/{album_id}/videos/{video_id}
Returns 204 No Content on success.
DELETE /vimeo/me/albums/{album_id}/videos/{video_id}
GET /vimeo/videos/{video_id}/comments
POST /vimeo/videos/{video_id}/comments Content-Type: application/json{ "text": "Great video!" }
Response:
{ "uri": "/videos/1163160198/comments/21372988", "text": "Great video!", "created_on": "2026-02-09T09:05:00+00:00" }
DELETE /vimeo/videos/{video_id}/comments/{comment_id}
Returns 204 No Content on success.
GET /vimeo/me/likes
PUT /vimeo/me/likes/{video_id}
Returns 204 No Content on success.
DELETE /vimeo/me/likes/{video_id}
Returns 204 No Content on success.
GET /vimeo/me/watchlater
PUT /vimeo/me/watchlater/{video_id}
Returns 204 No Content on success.
DELETE /vimeo/me/watchlater/{video_id}
Returns 204 No Content on success.
GET /vimeo/me/followers
GET /vimeo/me/following
PUT /vimeo/me/following/{user_id}
DELETE /vimeo/me/following/{user_id}
GET /vimeo/channels
GET /vimeo/channels/{channel_id}
GET /vimeo/categories
Response:
{ "total": 10, "data": [ {"uri": "/categories/animation", "name": "Animation"}, {"uri": "/categories/comedy", "name": "Comedy"}, {"uri": "/categories/documentary", "name": "Documentary"} ] }
GET /vimeo/categories/{category}/videos
Vimeo uses page-based pagination:
GET /vimeo/me/videos?page=1&per_page=25
Response:
{ "total": 50, "page": 1, "per_page": 25, "paging": { "next": "/me/videos?page=2", "previous": null, "first": "/me/videos?page=1", "last": "/me/videos?page=2" }, "data": [...] }
Parameters:
page - Page number (default 1)per_page - Results per page (default 25, max 100)const response = await fetch( 'https://gateway.maton.ai/vimeo/me/videos', { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } } ); const data = await response.json();
import os import requestsresponse = requests.get( 'https://gateway.maton.ai/vimeo/me/videos', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'} ) data = response.json()
import os import requestsresponse = requests.post( 'https://gateway.maton.ai/vimeo/me/folders', headers={ 'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}', 'Content-Type': 'application/json' }, json={'name': 'New Folder'} ) folder = response.json() print(f"Created folder: {folder['uri']}")
import os import requestsvideo_id = "1163160198" response = requests.patch( f'https://gateway.maton.ai/vimeo/videos/{video_id}', headers={ 'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}', 'Content-Type': 'application/json' }, json={ 'name': 'Updated Title', 'description': 'New description' } ) video = response.json() print(f"Updated video: {video['name']}")
1163160198)254399456)jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| 400 | Missing Vimeo connection or bad request |
| 401 | Invalid or missing Maton API key |
| 403 | Insufficient permissions or scope |
| 404 | Resource not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Vimeo API |
Vimeo errors include detailed messages:
{ "error": "Your access token does not have the \"create\" scope" }
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
vimeo. For example:https://gateway.maton.ai/vimeo/me/videoshttps://gateway.maton.ai/me/videosNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.