Introduction
# YouTube API
YouTube data access via [TranscriptAPI.com](https://transcriptapi.com) — no Google API quota needed.
## Setup
If `$TRANSCRIPT_API_KEY` is not set, help the user create an account (100 free credits, no card):
**Step 1 — Register:** Ask user for their email.
```bash node ./scripts/tapi-auth.js register --email USER_EMAIL ```
→ OTP sent to email. Ask user: _"Check your email for a 6-digit verification code."_
**Step 2 — Verify:** Once user provides the OTP:
```bash node ./scripts/tapi-auth.js verify --token TOKEN_FROM_STEP_1 --otp CODE ```
> API key saved to `~/.openclaw/openclaw.json`. See **File Writes** below for details. Existing file is backed up before modification.
Manual option: [transcriptapi.com/signup](https://transcriptapi.com/signup) → Dashboard → API Keys.
## File Writes
The verify and save-key commands save the API key to `~/.openclaw/openclaw.json` (sets `skills.entries.transcriptapi.apiKey` and `enabled: true`). **Existing file is backed up to `~/.openclaw/openclaw.json.bak` before modification.**
To use the API key in terminal/CLI outside the agent, add to your shell profile manually: `export TRANSCRIPT_API_KEY=<your-key>`
## API Reference
Full OpenAPI spec: [transcriptapi.com/openapi.json](https://transcriptapi.com/openapi.json) — consult this for the latest parameters and schemas.
## Endpoint Reference
All endpoints: `https://transcriptapi.com/api/v2/youtube/...`
Channel endpoints accept `channel` — an `@handle`, channel URL, or `UC...` ID. Playlist endpoints accept `playlist` — a playlist URL or ID.
| Endpoint | Method | Cost | | ----------------------------------- | ------ | -------- | | `/transcript?video_url=ID` | GET | 1 | | `/search?q=QUERY&type=video` | GET | 1 | | `/channel/resolve?input=@handle` | GET | **free** | | `/channel/latest?channel=@handle` | GET | **free** | | `/channel/videos?channel=@handle` | GET | 1/page | | `/channel/search?channel=@handle&q=Q` | GET | 1 | | `/playlist/videos?playlist=PL_ID` | GET | 1/page |
## Quick Examples
**Search videos:**
```bash curl -s "https://transcriptapi.com/api/v2/youtube/search\ ?q=python+tutorial&type=video&limit=10" \ -H "Authorization: Bearer $TRANSCRIPT_API_KEY" ```
**Get transcript:**
```bash curl -s "https://transcriptapi.com/api/v2/youtube/transcript\ ?video_url=dQw4w9WgXcQ&format=text&include_timestamp=true&send_metadata=true" \ -H "Authorization: Bearer $TRANSCRIPT_API_KEY" ```
**Resolve channel handle (free):**
```bash curl -s "https://transcriptapi.com/api/v2/youtube/channel/resolve?input=@TED" \ -H "Authorization: Bearer $TRANSCRIPT_API_KEY" ```
**Latest videos (free):**
```bash curl -s "https://transcriptapi.com/api/v2/youtube/channel/latest?channel=@TED" \ -H "Authorization: Bearer $TRANSCRIPT_API_KEY" ```
**Browse channel uploads (paginated):**
```bash curl -s "https://transcriptapi.com/api/v2/youtube/channel/videos?channel=@NASA" \ -H "Authorization: Bearer $TRANSCRIPT_API_KEY" # Use continuation token from response for next pages ```
**Browse playlist (paginated):**
```bash curl -s "https://transcriptapi.com/api/v2/youtube/playlist/videos?playlist=PL_PLAYLIST_ID" \ -H "Authorization: Bearer $TRANSCRIPT_API_KEY" ```
## Parameter Validation
| Field | Rule | | -------------- | ------------------------------------------------------- | | `channel` | `@handle`, channel URL, or `UC...` ID | | `playlist` | Playlist URL or ID (`PL`/`UU`/`LL`/`FL`/`OL` prefix) | | `q` (search) | 1-200 chars | | `limit` | 1-50 | | `continuation` | non-empty string |
## Why Not Google's API?
| | Google YouTube Data API | TranscriptAPI | | ----------- | ------------------------------- | -------------------------- | | Quota | 10,000 units/day (100 searches) | Credit-based, no daily cap | | Setup | OAuth + API key + project | Single API key | | Transcripts | Not available | Core feature | | Pricing | $0.0015/unit overage | $5/1000 credits |
## Errors
| Code | Meaning | Action | | ---- | ----------------- | ------------------------- | | 401 | Bad API key | Check key | | 402 | No credits | transcriptapi.com/billing | | 404 | Not found | Resource doesn't exist | | 408 | Timeout/retryable | Retry once after 2s | | 422 | Validation error | Check param format | | 429 | Rate limited | Wait, respect Retry-After |
Free tier: 100 credits, 300 req/min. Starter ($5/mo): 1,000 credits.