Openclaw-master-skills youtube
install
source · Clone the upstream repo
git clone https://github.com/LeoYeAI/openclaw-master-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/LeoYeAI/openclaw-master-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/youtube-api-skill" ~/.claude/skills/leoyeai-openclaw-master-skills-youtube && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/LeoYeAI/openclaw-master-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/youtube-api-skill" ~/.openclaw/skills/leoyeai-openclaw-master-skills-youtube && rm -rf "$T"
manifest:
skills/youtube-api-skill/SKILL.mdsafety · automated scan (low risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
- makes HTTP requests (curl)
- references .env files
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content
YouTube
Access the YouTube Data API v3 with managed OAuth authentication. Search videos, manage playlists, access channel information, and interact with comments and subscriptions.
Quick Start
# Search for videos python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/youtube/youtube/v3/search?part=snippet&q=coding+tutorial&type=video&maxResults=10') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Base URL
https://gateway.maton.ai/youtube/{native-api-path}
Replace
{native-api-path} with the actual YouTube Data API endpoint path. The gateway proxies requests to www.googleapis.com and automatically injects your OAuth token.
Authentication
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"
Getting Your API Key
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Google OAuth connections at
https://ctrl.maton.ai.
List Connections
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=youtube&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
Create Connection
python <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'youtube'}).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
Get Connection
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": "21fd90f9-5935-43cd-b6c8-bde9d915ca80", "status": "ACTIVE", "creation_time": "2025-12-08T07:20:53.488460Z", "last_updated_time": "2026-01-31T20:03:32.593153Z", "url": "https://connect.maton.ai/?session_token=...", "app": "youtube", "metadata": {} } }
Open the returned
url in a browser to complete OAuth authorization.
Delete Connection
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
Specifying Connection
If you have multiple YouTube 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/youtube/youtube/v3/channels?part=snippet&mine=true') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
API Reference
Search
Search Videos, Channels, or Playlists
GET /youtube/youtube/v3/search
Query parameters:
- Required:partsnippet
- Search queryq
- Filter by type:type
,video
,channelplaylist
- Results per page (1-50, default 5)maxResults
- Sort order:order
,date
,rating
,relevance
,titleviewCount
- Filter by publish date (RFC 3339)publishedAfter
- Filter by publish date (RFC 3339)publishedBefore
- Filter by channelchannelId
-videoDuration
(<4min),short
(4-20min),medium
(>20min)long
- Pagination tokenpageToken
Example:
curl -s -X GET "https://gateway.maton.ai/youtube/youtube/v3/search?part=snippet&q=machine+learning&type=video&maxResults=10&order=viewCount" -H "Authorization: Bearer $MATON_API_KEY"
Response:
{ "kind": "youtube#searchListResponse", "nextPageToken": "CAUQAA", "pageInfo": { "totalResults": 1000000, "resultsPerPage": 10 }, "items": [ { "kind": "youtube#searchResult", "id": { "kind": "youtube#video", "videoId": "abc123xyz" }, "snippet": { "publishedAt": "2024-01-15T10:00:00Z", "channelId": "UCxyz123", "title": "Machine Learning Tutorial", "description": "Learn ML basics...", "thumbnails": { "default": {"url": "https://i.ytimg.com/vi/abc123xyz/default.jpg"} }, "channelTitle": "Tech Channel" } } ] }
Videos
Get Video Details
GET /youtube/youtube/v3/videos?part=snippet,statistics,contentDetails&id={videoId}
Parts available:
- Title, description, thumbnails, channel infosnippet
- View count, likes, commentsstatistics
- Duration, dimension, definitioncontentDetails
- Upload status, privacy statusstatus
- Embedded player HTMLplayer
Example:
curl -s -X GET "https://gateway.maton.ai/youtube/youtube/v3/videos?part=snippet,statistics&id=dQw4w9WgXcQ" -H "Authorization: Bearer $MATON_API_KEY"
Get My Videos (Uploaded)
GET /youtube/youtube/v3/search?part=snippet&forMine=true&type=video&maxResults=25
Rate Video (Like/Dislike)
POST /youtube/youtube/v3/videos/rate?id={videoId}&rating=like
Rating values:
like, dislike, none
Get Trending Videos
GET /youtube/youtube/v3/videos?part=snippet,statistics&chart=mostPopular®ionCode=US&maxResults=10
Get Video Categories
GET /youtube/youtube/v3/videoCategories?part=snippet®ionCode=US
Channels
Get Channel Details
GET /youtube/youtube/v3/channels?part=snippet,statistics,contentDetails&id={channelId}
Get My Channel
GET /youtube/youtube/v3/channels?part=snippet,statistics,contentDetails&mine=true
Response:
{ "items": [ { "id": "UCxyz123", "snippet": { "title": "My Channel", "description": "Channel description", "customUrl": "@mychannel", "publishedAt": "2020-01-01T00:00:00Z", "thumbnails": {...} }, "statistics": { "viewCount": "1000000", "subscriberCount": "50000", "videoCount": "100" }, "contentDetails": { "relatedPlaylists": { "uploads": "UUxyz123" } } } ] }
Get Channel by Username
GET /youtube/youtube/v3/channels?part=snippet,statistics&forUsername={username}
Playlists
List My Playlists
GET /youtube/youtube/v3/playlists?part=snippet,contentDetails&mine=true&maxResults=25
Get Playlist
GET /youtube/youtube/v3/playlists?part=snippet,contentDetails&id={playlistId}
Create Playlist
POST /youtube/youtube/v3/playlists?part=snippet,status Content-Type: application/json { "snippet": { "title": "My New Playlist", "description": "A collection of videos", "defaultLanguage": "en" }, "status": { "privacyStatus": "private" } }
Privacy values:
public, private, unlisted
Update Playlist
PUT /youtube/youtube/v3/playlists?part=snippet,status Content-Type: application/json { "id": "PLxyz123", "snippet": { "title": "Updated Playlist Title", "description": "Updated description" }, "status": { "privacyStatus": "public" } }
Delete Playlist
DELETE /youtube/youtube/v3/playlists?id={playlistId}
Playlist Items
List Playlist Items
GET /youtube/youtube/v3/playlistItems?part=snippet,contentDetails&playlistId={playlistId}&maxResults=50
Add Video to Playlist
POST /youtube/youtube/v3/playlistItems?part=snippet Content-Type: application/json { "snippet": { "playlistId": "PLxyz123", "resourceId": { "kind": "youtube#video", "videoId": "abc123xyz" }, "position": 0 } }
Remove from Playlist
DELETE /youtube/youtube/v3/playlistItems?id={playlistItemId}
Subscriptions
List My Subscriptions
GET /youtube/youtube/v3/subscriptions?part=snippet&mine=true&maxResults=50
Check Subscription to Channel
GET /youtube/youtube/v3/subscriptions?part=snippet&mine=true&forChannelId={channelId}
Subscribe to Channel
POST /youtube/youtube/v3/subscriptions?part=snippet Content-Type: application/json { "snippet": { "resourceId": { "kind": "youtube#channel", "channelId": "UCxyz123" } } }
Unsubscribe
DELETE /youtube/youtube/v3/subscriptions?id={subscriptionId}
Comments
List Video Comments
GET /youtube/youtube/v3/commentThreads?part=snippet,replies&videoId={videoId}&maxResults=100
Add Comment to Video
POST /youtube/youtube/v3/commentThreads?part=snippet Content-Type: application/json { "snippet": { "videoId": "abc123xyz", "topLevelComment": { "snippet": { "textOriginal": "Great video!" } } } }
Reply to Comment
POST /youtube/youtube/v3/comments?part=snippet Content-Type: application/json { "snippet": { "parentId": "comment123", "textOriginal": "Thanks for your comment!" } }
Delete Comment
DELETE /youtube/youtube/v3/comments?id={commentId}
Code Examples
JavaScript
const headers = { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` }; // Search videos const results = await fetch( 'https://gateway.maton.ai/youtube/youtube/v3/search?part=snippet&q=tutorial&type=video&maxResults=10', { headers } ).then(r => r.json()); // Get video details const video = await fetch( 'https://gateway.maton.ai/youtube/youtube/v3/videos?part=snippet,statistics&id=dQw4w9WgXcQ', { headers } ).then(r => r.json()); // Create playlist await fetch( 'https://gateway.maton.ai/youtube/youtube/v3/playlists?part=snippet,status', { method: 'POST', headers: { ...headers, 'Content-Type': 'application/json' }, body: JSON.stringify({ snippet: { title: 'My Playlist', description: 'Videos I like' }, status: { privacyStatus: 'private' } }) } );
Python
import os import requests headers = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'} # Search videos results = requests.get( 'https://gateway.maton.ai/youtube/youtube/v3/search', headers=headers, params={'part': 'snippet', 'q': 'tutorial', 'type': 'video', 'maxResults': 10} ).json() # Get video details video = requests.get( 'https://gateway.maton.ai/youtube/youtube/v3/videos', headers=headers, params={'part': 'snippet,statistics', 'id': 'dQw4w9WgXcQ'} ).json() # Create playlist response = requests.post( 'https://gateway.maton.ai/youtube/youtube/v3/playlists?part=snippet,status', headers=headers, json={ 'snippet': {'title': 'My Playlist', 'description': 'Videos I like'}, 'status': {'privacyStatus': 'private'} } )
Notes
- Video IDs are 11 characters (e.g.,
)dQw4w9WgXcQ - Channel IDs start with
(e.g.,UC
)UCxyz123 - Playlist IDs start with
(user) orPL
(uploads)UU - Use
for pagination through large result setspageToken - The
parameter is required and determines what data is returnedpart - Quota costs vary by endpoint - search is expensive (100 units), reads are cheap (1 unit)
- Some write operations require channel verification
- IMPORTANT: When using curl commands, use
when URLs contain brackets (curl -g
,fields[]
,sort[]
) to disable glob parsingrecords[] - IMPORTANT: When piping curl output to
or other commands, environment variables likejq
may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.$MATON_API_KEY
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing YouTube connection or invalid request |
| 401 | Invalid or missing Maton API key |
| 403 | Forbidden - quota exceeded or insufficient permissions |
| 404 | Video, channel, or playlist not found |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from YouTube API |
Troubleshooting: API Key Issues
- Check that the
environment variable is set:MATON_API_KEY
echo $MATON_API_KEY
- Verify the API key is valid by listing connections:
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
Troubleshooting: Invalid App Name
- Ensure your URL path starts with
. For example:youtube
- Correct:
https://gateway.maton.ai/youtube/youtube/v3/search - Incorrect:
https://gateway.maton.ai/v3/search