Install
openclaw skills install vimeoVimeo 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 with the Vimeo community. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
openclaw skills install vimeoAccess 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://api.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://api.maton.ai/vimeo/{resource}
Maton 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://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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://api.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://api.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": "{connection_id}",
"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://api.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://api.maton.ai/vimeo/me')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
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://api.maton.ai/vimeo/me/videos',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
import os
import requests
response = requests.get(
'https://api.maton.ai/vimeo/me/videos',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
data = response.json()
import os
import requests
response = requests.post(
'https://api.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 requests
video_id = "1163160198"
response = requests.patch(
f'https://api.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://api.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://api.maton.ai/vimeo/me/videoshttps://api.maton.ai/me/videos