YTAPI Python client
Python client for YTAPI: YouTube transcripts, video details, search, channels and playlists over one HTTP API. It works from servers and cloud functions, where fetching YouTube directly tends to get blocked.
- No dependencies beyond the standard library. Python 3.10+.
- Typed responses (
TypedDict), typed errors, automatic retries and pagination. - Reference: docs.ytapi.dev.
Install
pip install ytapi-sdk
The package is ytapi-sdk on PyPI, and you import it as ytapi.
Quickstart
Get a key at ytapi.dev. New accounts get 200 free credits, and no card is needed.
from ytapi import YTAPI
api = YTAPI() # reads YTAPI_API_KEY (or YTAPI_KEY) from the environment
transcript = api.get_transcript("dQw4w9WgXcQ")
for segment in transcript["segments"][:3]:
print(segment["start"], segment["text"])
By default you get the captions in the video's own language, as timed segments. A successful request uses 1 credit, and errors are free.
Examples
# Other formats. markdown, text, srt and vtt come back as a string.
srt = api.get_transcript("dQw4w9WgXcQ", format="srt")
spanish = api.get_transcript("dQw4w9WgXcQ", format="text", languages=["es", "*"])
words = api.get_transcript("dQw4w9WgXcQ", format="word_timestamps", word_level=True)
# Free: title, length, channel and the caption languages a video has.
basic = api.get_basic_info("dQw4w9WgXcQ")
# 1 credit: description, counts, chapters and more.
info = api.get_video_info("dQw4w9WgXcQ")
# Channels take an @handle, a channel ID (UC...) or a URL.
channel = api.get_channel("@3blue1brown")
for video in api.iter_channel_videos("@3blue1brown", sort_by="popular"):
print(video["video_id"], video["title"])
# Playlists, page by page or as an iterator.
for video in api.iter_playlist_videos("PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"):
print(video["video_id"], video["length_text"])
# Search: type is video, channel, playlist, shorts or movie.
page = api.search("rust async", type="video", upload_date="month", limit=10)
for hit in page["items"]:
print(hit["title"])
# Search suggestions are free.
print(api.get_suggestions("nextjs")["suggestions"])
# Batch: up to 100 transcript or basic_info tasks per job.
job = api.create_batch(
[
{"id": "a", "type": "transcript", "video_id": "dQw4w9WgXcQ", "format": "text"},
{"id": "b", "type": "basic_info", "video_id": "jNQXAC9IVRw"},
]
)
done = api.poll_batch(job["id"], timeout=120)
print(done["successful"], done["credits_deducted"])
The iterators (iter_playlist_videos, iter_channel_videos, iter_channel_playlists, iter_search) follow next_cursor for you. Each page is a request and uses a credit. In a batch, each successful task uses 1 credit and failed tasks are free.
Errors
from ytapi import InsufficientCreditsError, NotFoundError, RateLimitedError, YTAPIError
try:
api.get_transcript("xxxxxxxxxxx")
except NotFoundError as exc:
print(exc.code) # captions_disabled, language_not_found, video_unavailable, ...
except RateLimitedError as exc:
print(exc.code, exc.retry_after) # rate_limited or daily_limit_exceeded
except InsufficientCreditsError:
print("Out of credits: https://ytapi.dev/#pricing")
except YTAPIError as exc:
print(exc.status, exc.code, exc) # status 0 means a network error
| Status | Exception |
|---|---|
| 401 | AuthError |
| 402 | InsufficientCreditsError |
| 404 | NotFoundError |
| 429 | RateLimitedError |
| 5xx | ServerError |
| network error | YTAPIError with status 0 |
| other | YTAPIError |
Retries
The client retries a 429, a 5xx or a network error up to max_retries times (default 2). It backs off from 0.5 seconds, doubling up to 8, and waits longer when the server sends Retry-After. A few cases are not retried:
- A 429 that asks for a long wait. The cutoff is
max_retry_wait, default 60 seconds. This includes a free account's daily limit (daily_limit_exceeded), which lasts until 00:00 UTC. The client raises these right away instead of hanging your program. - Creating a batch after a 5xx or a network error. The job may already exist, so a retry could start a second one.
Use YTAPI(max_retries=0) to turn retries off.
Releases
Each GitHub release publishes the matching version to PyPI through trusted publishing. The release tag must match the version in pyproject.toml, such as v0.1.0.
Tests
PYTHONPATH=src python3 -m unittest discover -s tests
The tests mock HTTP and need no network or API key.
License
MIT
Metadata
Release files for ytapi-sdk 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ytapi_sdk-0.1.0.tar.gz | 16.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ytapi_sdk-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 27.9 kB
Release files / ytapi_sdk-0.1.0.tar.gz
| Download URL | ytapi_sdk-0.1.0.tar.gz |
|---|---|
| Size | 16.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c04cb7127cddd06eceef68b864eadddf0f863c1c3a22a11b6d71899d6fc660f1
|
|
BLAKE2b-256 checksum How to use checksums |
3d5e8c130dac486f7ac80fffd03041765dd2abcb3ede31f16cf2d4bbe36bbf56
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logRelease files / ytapi_sdk-0.1.0-py3-none-any.whl
| Download URL | ytapi_sdk-0.1.0-py3-none-any.whl |
|---|---|
| Size | 11.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7506fa4a3d534c792460d152d9c1657ccae3777c7a5d65f00da332b28fb3ca4a
|
|
BLAKE2b-256 checksum How to use checksums |
fa6e250a75faccee093549a90907ecd18ccff840e038d5418c945be1a4f81674
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency log