PluginBench
Skill
Fail
Audit score 45

tavily-key-generator-proxy

aradotso/trending-skills

Auto-register Tavily API keys via browser automation and pool them behind a unified proxy gateway with round-robin load balancing.

What is tavily-key-generator-proxy?

Automates bulk Tavily account registration using Playwright and CapSolver CAPTCHA solving, then aggregates the resulting API keys behind a FastAPI proxy gateway. Use this to multiply your Tavily API quota (10 keys = 10,000 calls/month) and manage them through a single endpoint with web console, token management, and usage tracking.

  • Playwright-driven headless browser automation registers Tavily accounts and solves Cloudflare Turnstile CAPTCHAs
  • Extracts API keys from verified accounts and stores them in a pooled backend
  • FastAPI proxy distributes requests across keys with round-robin rotation and auto-disables failed keys
  • Web console at /console for managing keys, tokens, and viewing quota/usage statistics
  • Generates tvly- prefixed proxy tokens compatible with Tavily SDK without code changes
  • Tracks total quota (active_keys × 1,000 calls/month) and remaining usage in real-time

How to install tavily-key-generator-proxy

npx skills add https://github.com/aradotso/trending-skills --skill tavily-key-generator-proxy
Prerequisites
  • Python 3.8+
  • Playwright (Firefox browser automation)
  • CapSolver API key (~$0.001 per CAPTCHA solve) or browser-based CAPTCHA fallback
  • Email backend: either Cloudflare Email Worker (self-hosted) or DuckMail API access
  • Docker and Docker Compose (recommended for proxy deployment)
Claude Code
Cursor
Windsurf
Cline

How to use tavily-key-generator-proxy

  1. 1.Clone the key generator repository and install Python dependencies with pip
  2. 2.Configure config.py with your CapSolver API key and email backend (Cloudflare or DuckMail)
  3. 3.Run python main.py to start bulk account registration; specify how many keys to generate
  4. 4.Deploy the API proxy using docker compose up -d in the proxy/ directory
  5. 5.Access the web console at http://localhost:9874/console and log in with your admin password
  6. 6.Create access tokens via the admin API or console, then point your Tavily SDK or HTTP requests to http://your-server:9874 with the proxy token
  7. 7.Monitor quota and usage via /api/stats endpoint or the web dashboard

Use cases

Good for
  • Scale Tavily search API quota from 1,000 to 10,000+ calls/month by pooling free accounts
  • Run a shared Tavily proxy service for multiple applications or team members
  • Automate account registration and key rotation to avoid rate limits and bans
  • Monitor aggregate API usage and quota across all pooled keys from one dashboard
  • Replace Tavily base URL in existing SDK integrations without modifying application code
Who it's for
  • Developers needing high-volume Tavily API access without paid tier costs
  • DevOps engineers managing shared API infrastructure for multiple services
  • Teams running web scraping or search-heavy AI agents with quota constraints
  • Researchers automating large-scale data collection via Tavily search

tavily-key-generator-proxy FAQ

How many API keys can I generate and pool?

Each free Tavily account yields 1,000 API calls/month. Pool size depends on your email backend capacity and anti-ban throttling (recommended max 2-3 concurrent registrations). A pool of 10 keys = 10,000 calls/month total quota.

What email backend should I use?

Cloudflare Email Worker is free and self-hosted (recommended for production). DuckMail is a third-party temporary email service that requires an API token. Configure one or both in config.py; the CLI will prompt you to choose at runtime.

How do I integrate this with my existing Tavily code?

No code changes needed. Point the TavilyClient base_url to your proxy (e.g., http://your-server:9874) and use a proxy token instead of a real Tavily key. The proxy is API-compatible with Tavily's official endpoints.

What happens if a key fails or gets banned?

The proxy auto-disables keys after 3 consecutive failures and continues routing to healthy keys. Disabled keys do not count toward quota. Monitor stats via /api/stats and manually regenerate keys as needed.

Can I run this behind HTTPS and a domain name?

Yes. Use Nginx as a reverse proxy with Let's Encrypt SSL certificates (example config provided in SKILL.md). Set CORS_ORIGINS in .env to restrict access to your domains.

Full instructions (SKILL.md)

Source of truth, from aradotso/trending-skills.


name: tavily-key-generator-proxy description: Auto batch-register Tavily API keys via browser automation and pool them behind a unified proxy gateway with web console triggers:

  • tavily api key generator
  • batch register tavily accounts
  • tavily key pool proxy
  • automate tavily registration
  • tavily api proxy gateway
  • rotate tavily api keys
  • tavily capsolver automation
  • bulk tavily api keys

Tavily Key Generator + API Proxy

Skill by ara.so — Daily 2026 Skills collection

Automates bulk Tavily account registration using Playwright + CapSolver (Cloudflare Turnstile), then pools the resulting API keys behind a unified proxy gateway with round-robin rotation, usage tracking, token management, and a web console.


What It Does

ComponentLocationPurpose
Key Generatorroot /Playwright-driven headless Firefox registers Tavily accounts, solves Turnstile CAPTCHAs, verifies email, extracts API key
API Proxyproxy/FastAPI service that round-robins requests across pooled keys, exposes /api/search and /api/extract, serves web console at /console

Each free Tavily account yields 1,000 API calls/month. The proxy aggregates quota: 10 keys = 10,000 calls/month via one endpoint.


Installation

Key Generator

git clone https://github.com/skernelx/tavily-key-generator.git
cd tavily-key-generator
pip install -r requirements.txt
playwright install firefox
cp config.example.py config.py
# Edit config.py with your CapSolver key and email backend
python main.py

API Proxy (Docker — recommended)

cd proxy/
cp .env.example .env
# Set ADMIN_PASSWORD in .env
docker compose up -d
# Console at http://localhost:9874/console

Configuration (config.py)

CAPTCHA Solver (required)

# CapSolver — recommended (~$0.001/solve, high success rate)
CAPTCHA_SOLVER = "capsolver"
CAPSOLVER_API_KEY = "CAP-..."   # from capsolver.com

# Browser click fallback — free but low success rate
CAPTCHA_SOLVER = "browser"

Email Backend (required — pick one)

Option A: Cloudflare Email Worker (self-hosted, free)

EMAIL_BACKEND = "cloudflare"
EMAIL_DOMAIN = "mail.yourdomain.com"
EMAIL_API_URL = "https://mail.yourdomain.com"
EMAIL_API_TOKEN = "your-worker-token"

Option B: DuckMail (third-party temporary email)

EMAIL_BACKEND = "duckmail"
DUCKMAIL_API_BASE = "https://api.duckmail.sbs"
DUCKMAIL_BEARER = "dk_..."
DUCKMAIL_DOMAIN = "duckmail.sbs"

If both backends are configured, the CLI prompts you to choose at runtime.

Registration Throttle (anti-ban)

THREADS = 2                  # Max 3 — more = higher ban risk
COOLDOWN_BASE = 45           # Seconds between registrations
COOLDOWN_JITTER = 15         # Random additional seconds
BATCH_LIMIT = 20             # Pause after this many registrations

Auto-upload to Proxy (optional)

PROXY_AUTO_UPLOAD = True
PROXY_URL = "http://localhost:9874"
PROXY_ADMIN_PASSWORD = "your-admin-password"

Running the Key Generator

python main.py
# Prompts: how many keys to generate, which email backend
# Output: api_keys.md with all generated keys
# If PROXY_AUTO_UPLOAD=True, keys are pushed to proxy automatically

Generated api_keys.md format (used for bulk import into proxy):

tvly-abc123...
tvly-def456...
tvly-ghi789...

API Proxy Usage

Calling the Proxy (drop-in Tavily replacement)

# Search — replace base URL only
curl -X POST http://your-server:9874/api/search \
  -H "Authorization: Bearer tvly-YOUR_PROXY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "latest AI news", "search_depth": "basic"}'

# Extract
curl -X POST http://your-server:9874/api/extract \
  -H "Authorization: Bearer tvly-YOUR_PROXY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://example.com/article"]}'

Token can also be passed in the request body as api_key (Tavily SDK compatible):

import requests

response = requests.post(
    "http://your-server:9874/api/search",
    json={
        "query": "Python web scraping",
        "api_key": "tvly-YOUR_PROXY_TOKEN"
    }
)
print(response.json())

Python SDK Integration

from tavily import TavilyClient

# Point SDK at your proxy — no other changes needed
client = TavilyClient(
    api_key="tvly-YOUR_PROXY_TOKEN",
    base_url="http://your-server:9874"
)

results = client.search("machine learning trends 2025")

Admin API Reference

All admin endpoints require header: X-Admin-Password: your-password

Keys Management

# List all keys
curl http://localhost:9874/api/keys \
  -H "X-Admin-Password: secret"

# Add a single key
curl -X POST http://localhost:9874/api/keys \
  -H "X-Admin-Password: secret" \
  -H "Content-Type: application/json" \
  -d '{"key": "tvly-abc123..."}'

# Bulk import from api_keys.md text
curl -X POST http://localhost:9874/api/keys \
  -H "X-Admin-Password: secret" \
  -H "Content-Type: application/json" \
  -d '{"bulk": "tvly-abc...\ntvly-def...\ntvly-ghi..."}'

# Toggle key enabled/disabled
curl -X PUT http://localhost:9874/api/keys/{id}/toggle \
  -H "X-Admin-Password: secret"

# Delete key
curl -X DELETE http://localhost:9874/api/keys/{id} \
  -H "X-Admin-Password: secret"

Token Management

# Create access token
curl -X POST http://localhost:9874/api/tokens \
  -H "X-Admin-Password: secret" \
  -H "Content-Type: application/json" \
  -d '{"label": "my-app"}'
# Returns: {"token": "tvly-...", "id": "..."}

# List tokens
curl http://localhost:9874/api/tokens \
  -H "X-Admin-Password: secret"

# Delete token
curl -X DELETE http://localhost:9874/api/tokens/{id} \
  -H "X-Admin-Password: secret"

Stats

curl http://localhost:9874/api/stats \
  -H "X-Admin-Password: secret"
# Returns: total_quota, used, remaining, active_keys, disabled_keys

Change Admin Password

curl -X PUT http://localhost:9874/api/password \
  -H "X-Admin-Password: current-password" \
  -H "Content-Type: application/json" \
  -d '{"new_password": "new-secure-password"}'

Proxy Behavior

  • Round-robin: requests distributed evenly across active keys
  • Auto-disable: key disabled after 3 consecutive failures
  • Quota tracking: total = active_keys × 1,000/month; updates automatically on add/delete/toggle
  • Token format: proxy tokens use tvly- prefix, indistinguishable from real Tavily keys to clients

Proxy .env Configuration

ADMIN_PASSWORD=change-this-immediately
PORT=9874
# Optional: restrict CORS origins
CORS_ORIGINS=https://myapp.com,https://app2.com

Nginx Reverse Proxy + HTTPS

server {
    listen 443 ssl;
    server_name tavily-proxy.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:9874;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Integration Pattern: Auto-replenish Pool

# replenish.py — run on cron when quota runs low
import requests

PROXY_URL = "http://localhost:9874"
ADMIN_PASSWORD = "your-password"
MIN_ACTIVE_KEYS = 10

def get_stats():
    r = requests.get(f"{PROXY_URL}/api/stats",
                     headers={"X-Admin-Password": ADMIN_PASSWORD})
    return r.json()

def trigger_registration(count: int):
    """Call your key generator as subprocess or import directly"""
    import subprocess
    subprocess.run(["python", "main.py", "--count", str(count)], check=True)

stats = get_stats()
active = stats["active_keys"]
if active < MIN_ACTIVE_KEYS:
    needed = MIN_ACTIVE_KEYS - active
    print(f"Pool low ({active} keys), registering {needed} more...")
    trigger_registration(needed)

Troubleshooting

ProblemCauseFix
CAPTCHA solve failuresTavily elevated bot detectionPause several hours, reduce THREADS to 1
Email verification timeoutSlow email deliveryIncrease poll timeout in config
Keys immediately disabled in proxyTavily account flagged/suspendedRegister from different IP
playwright install firefox failsMissing system depsRun playwright install-deps firefox first
Docker compose port conflict9874 in useChange PORT in .env and docker-compose.yml
X-Admin-Password 401Wrong passwordCheck .env, restart container after changes
IP ban during registrationToo many registrationsUse BATCH_LIMIT=10, wait hours between batches

Rate Limit Safe Settings

# Conservative — minimizes ban risk
THREADS = 1
COOLDOWN_BASE = 60
COOLDOWN_JITTER = 30
BATCH_LIMIT = 10

Security Checklist

  • Change ADMIN_PASSWORD from default immediately after deploy
  • Add config.py to .gitignore (already included, verify before push)
  • Deploy behind HTTPS in production
  • Rotate proxy tokens periodically
  • Never commit api_keys.md to public repositories