Manage and analyze your YouTube channel from the terminal. Designed for humans and AI agents.
Project description
YT Studio CLI
Manage and analyze your YouTube channel from the terminal. Designed for humans and AI agents.
[!NOTE] This is not an official Google product, see disclaimer.
Motivation
I built this because I needed to bulk update video titles for a YouTube channel I manage with 300+ videos. YouTube Studio does not support bulk search-replace operations, which made it a tedious manual process. This tool uses the YouTube Data API to perform bulk operations on video metadata. Furthermore, it provides features for analytics and comment moderation, all accessible from the command line.
Features
- Bulk update video metadata across hundreds of videos in one pass (search-replace titles, descriptions, tags).
- Upload videos from a directory using YAML sidecars for metadata and thumbnails.
- Schedule, start, stop, and update YouTube livestream broadcasts, including RTMP ingest details.
- Multi-channel profiles: manage several channels from one machine and switch per command.
- Comments moderation: list, reply, approve, reject, and ban from the CLI.
- Channel analytics queries via the YouTube Analytics API.
- Playlists: bulk-add by search and reorder by views with one command.
Documentation
See the full documentation for installation, OAuth setup, and the command reference.
Agent skill
This repo includes a harness-agnostic agent skill that teaches any skill-aware AI agent to operate a channel through this CLI, following the open SKILL standard.
Development
Clone the repo, sync dev dependencies, and install the pre-commit hook so
ruff check and ruff format run on every commit (same checks CI runs):
uv sync --group dev
uv run pre-commit install
Run the suite manually with uv run pytest and uv run pre-commit run --all-files.
To preview the docs site locally, install the docs group and serve with mkdocs:
uv sync --group docs
uv run mkdocs serve # or: uv run mkdocs build
API quota
The YouTube Data API enforces a default quota of 10_000 units per project per day. Most read operations (listing videos, comments, channel info) cost 1 unit, while write operations like updating video metadata or moderating comments cost 50 units each. Bulk updates can consume quota quickly. When exceeded, the API returns a 403 error; quota resets at midnight Pacific Time.
| Action | Examples | Approx. cost |
|---|---|---|
| Read | list videos, comments, playlists; analytics queries | 1 unit |
| Write | update a video, moderate a comment, add or reorder playlist items, schedule a broadcast | 50 units |
| Search | search.list, used by playlists add --from-search |
100 units |
| Upload | videos.insert |
~1600 units |
A full per-operation breakdown lives in the API quota docs.
You can request a quota increase via IAM & Admin → Quotas in the Google Cloud Console. See the official quota documentation for full details.
Disclaimer
This is not an officially supported Google or YouTube product. YouTube and YouTube Studio are trademarks of Google. All channel data is accessed exclusively through the official YouTube Data API and YouTube Analytics API.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ytstudio_cli-0.4.1.tar.gz.
File metadata
- Download URL: ytstudio_cli-0.4.1.tar.gz
- Upload date:
- Size: 162.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81ab435a56adc6df79be11ecaa0e93f30d6e8f9b327aa1374680ec5804c92cfd
|
|
| MD5 |
2e063eb38888461af47467f44fe8c37e
|
|
| BLAKE2b-256 |
58d1e1e3e74b3f179d6f1789850a5d4d824e51d1cfce54fad09f2857fc6253cf
|
Provenance
The following attestation bundles were made for ytstudio_cli-0.4.1.tar.gz:
Publisher:
release.yml on jdwit/ytstudio-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ytstudio_cli-0.4.1.tar.gz -
Subject digest:
81ab435a56adc6df79be11ecaa0e93f30d6e8f9b327aa1374680ec5804c92cfd - Sigstore transparency entry: 1859081709
- Sigstore integration time:
-
Permalink:
jdwit/ytstudio-cli@c4816e16f2673c85cad5ccfaea80fe73bb74d2b9 -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/jdwit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c4816e16f2673c85cad5ccfaea80fe73bb74d2b9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ytstudio_cli-0.4.1-py3-none-any.whl.
File metadata
- Download URL: ytstudio_cli-0.4.1-py3-none-any.whl
- Upload date:
- Size: 51.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4dcb0697d4716c70405afaa3507f4aa1d4381aed7b37bf389a29db5b39a70f0
|
|
| MD5 |
9c7fa4764235b90cdfe69fac76642c76
|
|
| BLAKE2b-256 |
a962d2a7f0e0cab3ff0c4acbad6da527fd73fad000b95af96ea036f58bff820d
|
Provenance
The following attestation bundles were made for ytstudio_cli-0.4.1-py3-none-any.whl:
Publisher:
release.yml on jdwit/ytstudio-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ytstudio_cli-0.4.1-py3-none-any.whl -
Subject digest:
d4dcb0697d4716c70405afaa3507f4aa1d4381aed7b37bf389a29db5b39a70f0 - Sigstore transparency entry: 1859081962
- Sigstore integration time:
-
Permalink:
jdwit/ytstudio-cli@c4816e16f2673c85cad5ccfaea80fe73bb74d2b9 -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/jdwit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c4816e16f2673c85cad5ccfaea80fe73bb74d2b9 -
Trigger Event:
push
-
Statement type: