DocsCommand-line tool (CLI)

Command-line tool (CLI)

Install transcript1 to transcribe YouTube links and local files from your terminal. Batch folders, save subtitles or return JSON for scripts and agents.

Run transcript1 with a YouTube link or a local audio or video file to get its transcript. The standalone CLI needs no Node.js.

Install

On macOS or Linux (x64 or ARM64):

curl -fsSL https://transcript1.com/install.sh | sh

The installer puts the binary in ~/.local/bin and prints a PATH hint if needed. Set TRANSCRIPT1_INSTALL_DIR to choose another folder.

It also adds t1, a short alias for transcript1. If you use zsh, it adds alias transcript1='noglob transcript1' to ~/.zshrc so links with ? work unquoted; set TRANSCRIPT1_NO_MODIFY_SHELL=1 to skip that.

On Windows x64, open PowerShell:

irm https://transcript1.com/install.ps1 | iex

This installs to %LOCALAPPDATA%\Programs\transcript1, adds t1.cmd as a short alias and adds the folder to your user PATH. Open a new terminal to use it.

Sign in

Create a key on the API keys page, then run:

transcript1 login

Paste your key when asked. login checks it before saving it. For scripts and agents, set TRANSCRIPT1_API_KEY; it takes priority over the saved key. transcript1 logout removes the saved key.

transcript1 'https://youtu.be/dQw4w9WgXcQ'

The command waits for the transcript and prints text to stdout. It uses YouTube captions when available and AI transcription otherwise. Progress goes to stderr.

Tip: in zsh, quote links. An unquoted & splits the command, and ? is a glob unless you use the alias the installer adds.

Transcribe a file

transcript1 interview.mp3
transcript1 -f srt -o interview.srt interview.mp3

Files can be up to 2 GB (2,000,000,000 bytes). Supported extensions are mp3, wav, m4a, flac, ogg, opus, mp4, mov, webm and mkv. The CLI uploads the file and waits for the transcript.

Batches

Pass several inputs or a folder:

transcript1 interview.mp3 lecture.mp4
transcript1 -o transcripts/ ./recordings
transcript1 --jobs 4 -o transcripts/ interview.mp3 'https://youtu.be/dQw4w9WgXcQ'

File patterns like recordings/*.mp3 work, also on Windows. Folders expand to their top-level media files, sorted by name. Several inputs write one file each to ./transcripts by default. --jobs controls how many inputs run at once: 1–20, with a default of 2.

Use - to read one link or file path per line from stdin. In a shell on macOS or Linux:

transcript1 -o transcripts/ - < inputs.txt

Blank lines and lines starting with # are skipped. Exact duplicate inputs run once.

With one input, -o names an output file, or a folder if it already exists or ends in /. With several inputs, -o names a folder. Missing output folders are created.

Inputs whose output file already exists are skipped. Add --overwrite to redo them:

transcript1 --overwrite -o transcripts/ ./recordings

Formats and options

OptionMeaning
-f, --formattext (default), srt, vtt or json. JSON returns the API transcription object.
--speakersLabel speakers as Speaker 1, Speaker 2 and so on.
--timestampsPut [hh:mm:ss] before each line. Text format only.
--languageAn ISO 639-1 language code, or auto (default).
--sourceFor YouTube: auto (default), captions or stt.
--freshDo not reuse a YouTube transcription from the last 24 hours.

For speaker labels with timestamps:

transcript1 --speakers --timestamps --language en interview.mp3

--speakers cannot be combined with --source captions. Files accept auto or stt, not captions. See Sources and options for how sources and language hints work.

Scripts and agents

Agents with a shell can install the CLI, set TRANSCRIPT1_API_KEY and run transcript1 <link> or transcript1 <file>. For clients using MCP, see MCP server setup.

Use --json for one JSON line per input on stdout as it finishes, with no progress, summary or update notice:

transcript1 --json 'https://youtu.be/dQw4w9WgXcQ'

Each finished job is the API transcription object plus input and reused. When a transcript is written to a file, the line includes file and omits transcript. Errors before an id exists have input and an error object with code and message. Skipped inputs have input, skipped (exists or out_of_minutes) and file when applicable.

With one input and no -o, --json includes the transcript in the object and ignores -f. With several inputs and no -o, transcripts go to ./transcripts and each JSON line includes file instead of transcript. Whenever a file is written, -f selects its format. Use -q or --quiet to suppress progress and summaries while keeping transcript output and errors.

To start a job without waiting, then fetch it later:

transcript1 --no-wait interview.mp3
transcript1 get <id>

Replace <id> with the id printed by the first command. --no-wait prints the id and status, or the object with --json. get waits while the job runs; it accepts -f, -o, --timestamps, --no-wait, --json and -q.

Updates

transcript1 update

The CLI checks for a newer release at most once per 24 hours when stderr is a terminal and shows a notice if one is available. Set TRANSCRIPT1_NO_UPDATE_CHECK=1 to disable the check. --json and -q also suppress it.

Exit codes

CodeMeaning
0Every input succeeded or was skipped because its output file exists.
1At least one input failed or was skipped for lack of minutes.
2Usage or sign-in problem.
130Interrupted.

Run transcript1 --help (or transcript1 alone) for all commands and flags.

Updated October 15, 2026