Tavily CLI
CLI and agent tools for the Tavily API — search, extract, crawl, map, and research from the command line.
Note: This package provides the
tvlycommand-line tool. It depends ontavily-python, the official Tavily Python SDK.
Features
- Interactive REPL — Run
tvlywith no arguments for a chat-like shell experience - CLI for Humans & AI Agents — Rich-formatted output for humans,
--jsonfor agents - Web Search — LLM-optimized search with domain/date filtering and relevance scoring
- Content Extraction — Extract clean markdown from any URL
- Website Crawling — Crawl sites with depth/breadth control and path filtering
- URL Discovery — Map all URLs on a site without content extraction
- Deep Research — AI-powered research with citations and structured output
- Self-Update — Check for and install CLI updates through the original package manager
Installation
Requires Python 3.10+.
Guided installer
curl -fsSL https://raw.githubusercontent.com/tavily-ai/tavily-cli/main/install.sh | sh
On a fresh interactive desktop installation, the installer starts tvly init
to guide authentication, agent detection, skill installation, and verification.
In CI, SSH/headless, and other non-interactive environments, run tvly init
separately after installation.
Package manager
pip install tavily-cli
From source
git clone https://github.com/tavily-ai/tavily-cli.git
cd tavily-cli
pip install -e .
Updating
# Check without changing the installation
tvly update --check
# Update through uv, pipx, or pip
tvly update
Source and direct-URL installations are detected and must be updated from their original source.
Quick Start
Keyless mode
tvly search and tvly extract work without an API key — try them right
after installing. A fair-use rate-limit cap applies; when reached, the CLI
prints a clear message with sign-up and continuation options. All other
commands (crawl, map, research) require a key.
pip install tavily-cli
tvly search "latest AI trends"
tvly extract https://example.com
1. Authenticate
# Browser OAuth (no Node.js required)
tvly login
# Headless / SSH: print the URL instead of opening a browser
tvly login --no-browser
# Or set API key directly
tvly login --api-key tvly-YOUR_KEY
# Or use environment variable
export TAVILY_API_KEY=tvly-YOUR_KEY
# Check auth status
tvly auth
2. Interactive Mode
# Launch the interactive REPL
tvly
This opens a chat-like shell where you can run commands without the tvly prefix:
❯ search "latest AI trends"
❯ extract https://example.com
❯ help
3. Search the Web
# Basic search
tvly search "latest AI trends"
# Advanced search with filters
tvly search "quantum computing" --depth advanced --max-results 10 --time-range week
# Search specific domains
tvly search "SEC filings for Apple" --include-domains sec.gov,reuters.com
# JSON output for agents
tvly search "AI news" --json
# Set client_name for attribution
tvly search "latest AI news" --client-name x
4. Extract Content from URLs
# Extract a single URL
tvly extract https://example.com/article
# Extract multiple URLs with a focus query
tvly extract https://example.com https://other.com --query "pricing information"
# Advanced extraction for JS-heavy pages
tvly extract https://spa-app.com --extract-depth advanced
5. Crawl a Website
# Basic crawl
tvly crawl https://docs.example.com
# Deep crawl with filters
tvly crawl https://docs.example.com --max-depth 2 --limit 100 --select-paths "/api/.*,/guides/.*"
# Semantic focus
tvly crawl https://docs.example.com --instructions "Find authentication docs" --chunks-per-source 3
# Save pages as markdown files
tvly crawl https://docs.example.com --output-dir ./docs
6. Map URLs
# Discover all URLs on a site
tvly map https://example.com
# Filter by path
tvly map https://example.com --select-paths "/blog/.*" --limit 500
7. Deep Research
# Run research and wait for results
tvly research "Competitive landscape of AI code assistants"
# Use pro model for comprehensive analysis
tvly research "Electric vehicle market analysis" --model pro
# Stream results in real-time
tvly research "AI market trends" --stream
# Async: start and poll separately
tvly research "topic" --no-wait --json # returns request_id
tvly research status <request_id> --json # check status
tvly research poll <request_id> --json # wait and get result
# Structured output
tvly research "AI market size" --output-schema schema.json --json
CLI Overview
tvly
├── (no command) # Interactive REPL
├── login # Authenticate (OAuth or API key)
├── logout # Clear stored credentials
├── auth # Check authentication status
├── search <query> # Web search
├── extract <urls...> # Extract content from URLs
├── crawl <url> # Crawl a website
├── map <url> # Discover URLs (no content)
├── update # Check for or install CLI updates
└── research <query> # Deep research (async)
├── run <query> # Start a research task (same as above)
├── status <id> # Check task status
└── poll <id> # Poll until completion
Non-Interactive Mode (for AI Agents & Scripts)
All commands support --json output and can be fully controlled via CLI arguments.
# Every command supports --json for structured output
tvly search "query" --json
tvly auth --json
tvly extract https://example.com --json
tvly update --check --json
# Read input from stdin with "-"
echo "What is the latest funding for Anthropic?" | tvly search - --json
echo "Research question" | tvly research - --json
# Async research: launch then poll separately
tvly research "question" --no-wait --json # returns request_id
tvly research status <id> --json # check status
tvly research poll <id> --json # wait and get result
# Global options
tvly --version # show version
tvly --status # show version + auth status
tvly --status --json # structured status
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Local setup or update error |
| 2 | Invalid input / usage error |
| 3 | Authentication error |
| 4 | API or update-check error |
Command Reference
tvly search
| Option | Description |
|---|---|
--depth |
ultra-fast, fast, basic (default), advanced |
--max-results |
Maximum results, 0-20 (default: 5) |
--topic |
general (default), news, finance |
--time-range |
day, week, month, year |
--start-date |
Results after date (YYYY-MM-DD) |
--end-date |
Results before date (YYYY-MM-DD) |
--include-domains |
Comma-separated domains to include |
--exclude-domains |
Comma-separated domains to exclude |
--country |
Boost results from country |
--include-answer |
Include AI answer (basic or advanced) |
--include-raw-content |
Include full page (markdown or text) |
--include-images |
Include image results |
--chunks-per-source |
Chunks per source (advanced/fast depth only) |
-o / --output |
Save output to file |
--client-name |
Set optional client_name for request attribution |
tvly update
Check PyPI for the latest Tavily CLI release and update through the package manager responsible for the active installation.
tvly update --check
tvly update
tvly update --check --json
--check is read-only. Source/direct-URL installations are reported without
being modified. JSON output includes can_update and blocked_reason so
automation can distinguish an available release from a supported self-update.
tvly extract
| Option | Description |
|---|---|
--query |
Rerank chunks by relevance |
--chunks-per-source |
Chunks per source (1-5, requires --query) |
--extract-depth |
basic (default) or advanced |
--format |
markdown (default) or text |
--include-images |
Include image URLs |
--timeout |
Max wait (1-60 seconds) |
-o / --output |
Save output to file |
--client-name |
Set optional client_name for request attribution |
tvly crawl
| Option | Description |
|---|---|
--max-depth |
Levels deep (1-5, default: 1) |
--max-breadth |
Links per page (default: 20) |
--limit |
Total pages cap (default: 50) |
--instructions |
Natural language guidance |
--chunks-per-source |
Chunks per page (1-5, requires --instructions) |
--extract-depth |
basic or advanced |
--format |
markdown or text |
--select-paths |
Regex patterns for paths to include |
--exclude-paths |
Regex patterns for paths to exclude |
--select-domains |
Regex for domains to include |
--exclude-domains |
Regex for domains to exclude |
--allow-external |
Include external links (default: true) |
--include-images |
Include images |
--timeout |
Max wait (10-150 seconds) |
-o / --output |
Save JSON to file |
--output-dir |
Save each page as .md file in directory |
--client-name |
Set optional client_name for request attribution |
tvly map
| Option | Description |
|---|---|
--max-depth |
Levels deep (1-5, default: 1) |
--max-breadth |
Links per page (default: 20) |
--limit |
Max URLs to discover (default: 50) |
--instructions |
Natural language guidance |
--select-paths |
Regex patterns for paths to include |
--exclude-paths |
Regex patterns for paths to exclude |
--allow-external |
Include external links |
--timeout |
Max wait (10-150 seconds) |
-o / --output |
Save output to file |
--client-name |
Set optional client_name for request attribution |
tvly research <query> / tvly research run <query>
| Option | Description |
|---|---|
--model |
mini, pro, or auto (default) |
--no-wait |
Return request_id immediately |
--stream |
Stream results in real-time |
--output-schema |
Path to JSON schema file |
--citation-format |
numbered, mla, apa, chicago |
--poll-interval |
Seconds between checks (default: 10) |
--timeout |
Max wait seconds (default: 600) |
-o / --output |
Save output to file |
--client-name |
Set optional client_name for request attribution |
tvly research status
Check research task status by request ID. Supports --client-name.
tvly research poll
Poll until completion and return results. Same --poll-interval, --timeout, -o, and --client-name options as run.
Environment Variables
| Variable | Description |
|---|---|
TAVILY_API_KEY |
API key (highest priority, no login needed) |
TAVILY_HUMAN_ID |
Optional identifier attached to every request for usage attribution |
# Via env var (highest priority)
export TAVILY_HUMAN_ID=alice@example.com
# Or persist it in the config file
# (~/.tavily/config.json — set the "human_id" key)
Related
tavily-python— Official Tavily Python SDK- Tavily Docs — Full API documentation
License
MIT
Release files for tavily-cli 0.1.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tavily_cli-0.1.8.tar.gz | 58.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tavily_cli-0.1.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 112.4 kB
Release files / tavily_cli-0.1.8.tar.gz
| Download URL | tavily_cli-0.1.8.tar.gz |
|---|---|
| Size | 58.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3b660c961e8bc93309964ccfc6982f3a17dcae15b59cc1e36924ccf4edfdec08
|
|
BLAKE2b-256 checksum How to use checksums |
bc8abb8437105cc2d4794a344b6a4ed84b2fb0002e1973b06d33d7f882c14a76
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / tavily_cli-0.1.8-py3-none-any.whl
| Download URL | tavily_cli-0.1.8-py3-none-any.whl |
|---|---|
| Size | 54.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
75d307879a9cf37cf693785662ec842063d8c0ac3287125c142e31888afd45d5
|
|
BLAKE2b-256 checksum How to use checksums |
f0d3f4c270eee0e3ab9695d228b1f31fd292afe574597fca4f82f9fa52ff63e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|