A fast, single-binary CLI for Otter.ai, built in Rust.
Manage meeting transcripts, upload recordings, search across conversations, and automate Otter.ai from your terminal — with structured JSON output and full agentic workflow support.
# Homebrew (macOS/Linux)
brew install osodevops/tap/ottercli
# Pre-built binaries — download from GitHub Releases
# https://github.com/osodevops/otterai-cli/releases
# From source
cargo install --git https://github.com/osodevops/otterai-cliAuthenticate with your Otter.ai email and password:
ottercli auth login --email you@example.com --password your-passwordOr use environment variables:
export OTTER_EMAIL=you@example.com
export OTTER_PASSWORD=your-password
ottercli auth loginSession cookies are saved locally (~/.config/ottercli/session.json on Linux, ~/Library/Application Support/ottercli/session.json on macOS) so you only need to login once. Sessions persist across CLI invocations.
# List your transcripts
ottercli speeches list --limit 10
# Get a specific transcript
ottercli speeches get SPEECH_ID
# Get just the transcript text
ottercli speeches get SPEECH_ID --transcript
# Get the AI summary
ottercli speeches get SPEECH_ID --summary
# Get action items
ottercli speeches get SPEECH_ID --action-items
# Search across all transcripts
ottercli search "quarterly review"
# Upload a recording for transcription
ottercli speeches upload ./meeting.mp4
# Download a transcript
ottercli speeches download SPEECH_ID --format txt --output transcript.txt
# Delete a transcript
ottercli speeches delete SPEECH_ID --confirmottercli auth login # Authenticate with Otter.ai
ottercli auth logout # Clear stored session
ottercli auth whoami # Show current user info
ottercli auth status # Check if session is valid (exit code 0/1)
ottercli auth refresh # Force session refreshottercli speeches list # List all transcripts
ottercli speeches list --limit 5 # Limit results
ottercli speeches list --after 2025-01-01 # Filter by date
ottercli speeches list --source shared # Show shared transcripts
ottercli speeches get SPEECH_ID # Full transcript details
ottercli speeches get SPEECH_ID --transcript # Transcript only
ottercli speeches get SPEECH_ID --summary # AI summary only
ottercli speeches get SPEECH_ID --action-items # Action items only
ottercli speeches get SPEECH_ID --speakers # Speaker breakdown
ottercli speeches get SPEECH_ID --word-cloud # Keywords
ottercli speeches search "keyword" # Search all transcripts
ottercli speeches search "keyword" --speech-id ID # Search within one transcript
ottercli speeches upload ./recording.mp4 # Upload for transcription
ottercli speeches upload ./audio.mp3 # Auto-detects MIME type
ottercli speeches download SPEECH_ID --format txt # Download as text
ottercli speeches download SPEECH_ID --format pdf # Download as PDF
ottercli speeches download SPEECH_ID --format srt --output subs.srt
ottercli speeches delete SPEECH_ID --confirm # Move to trashottercli speakers list # List known speakers
ottercli speakers create --name "Name" # Create a speakerottercli folders list # List foldersottercli groups list # List groupsottercli search "keyword" # Search across all transcripts
ottercli search "keyword" --limit 10 # Limit resultsottercli notifications get # Get notification settingsottercli config init # Create default config file
ottercli config path # Show config file path
ottercli config get # Show current config
ottercli config set key value # Set a config valueottercli completions bash >> ~/.bashrc
ottercli completions zsh >> ~/.zshrc
ottercli completions fish > ~/.config/fish/completions/ottercli.fishottercli auto-detects the output format:
- TTY (interactive terminal): Human-readable pretty-printed JSON
- Pipe (non-interactive): Machine-readable JSON envelope
Override with --output:
ottercli speeches list --output json # Force JSON
ottercli speeches list --output human # Force human-readable
ottercli speeches list --output plain # Plain textAll JSON output follows a standard envelope:
{
"ok": true,
"data": { ... },
"meta": {
"request_id": "uuid",
"timestamp": "2025-01-01T00:00:00Z",
"duration_ms": 123
}
}Upload supports auto-detection of MIME types by extension:
| Extension | Type |
|---|---|
.mp3 |
audio/mpeg |
.mp4, .m4v |
video/mp4 |
.m4a |
audio/mp4 |
.wav |
audio/wav |
.ogg, .oga |
audio/ogg |
.flac |
audio/flac |
.webm |
video/webm |
.aac |
audio/aac |
.wma |
audio/x-ms-wma |
Override with --content-type:
ottercli speeches upload ./file.bin --content-type audio/mpegConfig file location:
- Linux:
~/.config/ottercli/config.toml - macOS:
~/Library/Application Support/ottercli/config.toml
[default]
email = "you@example.com"
[output]
format = "auto" # auto, json, human, plain
color = true
page_size = 25
[network]
timeout = 30
max_retries = 3
retry_backoff_base = 2
[watch]
interval = 60Use named profiles for multiple accounts:
ottercli --profile work auth login --email work@company.com --password ...
ottercli --profile personal auth login --email me@gmail.com --password ...
ottercli --profile work speeches list
ottercli --profile personal speeches list| Variable | Description |
|---|---|
OTTER_EMAIL |
Login email |
OTTER_PASSWORD |
Login password |
RUST_LOG |
Tracing filter (e.g., debug, ottercli=trace) |
ottercli speeches list # Warnings only
ottercli -v speeches list # Info level
ottercli -vv speeches list # Debug level
ottercli -vvv speeches list # Trace level| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | General error |
| 2 | Authentication error |
| 3 | Not found |
| 4 | Rate limited |
| 5 | Network error |
| 6 | Invalid input |
ottercli is designed for use by AI agents and automation. Key features:
- Structured JSON output when piped — parse with
jqor any JSON library - Deterministic exit codes for error handling
- No interactive prompts when
--confirmflags are used - Environment variable auth — no interactive login needed
- Idempotent operations — safe to retry
Example in a script:
#!/bin/bash
export OTTER_EMAIL=you@example.com
export OTTER_PASSWORD=your-password
# Login
ottercli auth login
# Get latest transcripts as JSON
transcripts=$(ottercli speeches list --limit 5 --output json)
# Extract speech IDs
echo "$transcripts" | jq -r '.data.speeches[].otid' | while read id; do
# Download each as text
ottercli speeches download "$id" --format txt --output "transcripts/${id}.txt"
donecargo build # Debug build
cargo build --release # Release build
cargo test --lib --bins # Unit tests
cargo test --features integration # Integration tests
cargo fmt -- --check # Check formatting
cargo clippy --all-targets -- -D warnings # LintMIT