pypi tierproxystdioApache-2.0updated 3mo ago
🚧 Preview release. Gateway is not yet generally available. Join the waitlist at hello@tierproxy.com. SDK is functional but tierproxy doctor against a live gateway requires invitation.
What can you do with tierproxy?
tierproxy — Python SDK
🚧 Preview release. Gateway is not yet generally available. Join the waitlist at hello@tierproxy.com. SDK is functional but
tierproxy doctoragainst a live gateway requires invitation.
Premium multi-provider proxy infrastructure for AI/ML pipelines. Built for engineers who measure cost, latency, and success rate twice — and write Python.
Install
pip install tierproxy
Quickstart — five-second flavor
import tierproxy
r = tierproxy.get("https://example.com", country="US")
print(r.text)
That's it. (Set TIERPROXY_API_KEY env var first.)
Three lines, persistent session
from tierproxy import TierProxy
with TierProxy() as g:
print(g.me.get().client_id)
r = g.get("https://example.com", country="US", session_id="s1")
Auto-pick the cheapest healthy upstream every request
g = TierProxy(routing="cheapest") # also: "fastest", "most_reliable", "balanced"
g.get("https://example.com") # picks via /v1/health/upstreams under the hood
Cost guardrails
g = TierProxy(
monthly_budget_usd=200.0, # raises BudgetExceededError before going over
)
Power-user knobs
import httpx
from tierproxy import TierProxy
from tierproxy.retry import RetryPolicy
g = TierProxy(
api_key="tp_live_...",
base_url="https://my-self-hosted-gw:8444",
timeout=10.0,
retry_policy=RetryPolicy(max_retries=5, retry_on_status=frozenset({500, 502})),
http_client=httpx.Client(verify=False), # custom transport
user_agent_suffix="my-app/2.3", # attribution
)
Raw modes (Playwright, curl, etc.)
from tierproxy import ProxyURL
p = ProxyURL(api_key="tp_live_...", country="US", mode="username_encoding")
print(p.http_url()) # http://customer-tp_live_...-cc-US:x@gw.tierproxy.com:443
Error handling
Every SDK error inherits from tierproxy.TierProxyError and carries a
request_id for support escalation:
from tierproxy import TierProxy, RateLimitError
import time
with TierProxy() as g:
try:
resp = g.get("https://example.com/page")
except RateLimitError as e:
time.sleep(e.retry_after or 5)
resp = g.get("https://example.com/page")
See Errors reference for the full HTTP-status-to-exception mapping.
AI agent integration
The SDK exposes its response models as JSON Schema and as pre-built tool definitions for Anthropic Claude and OpenAI function-calling:
import anthropic
from tierproxy import TierProxy, schemas
with TierProxy() as gw:
anthropic.Anthropic().messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=schemas.anthropic_tools(),
messages=[{"role": "user", "content": "How much quota is left?"}],
)
See the AI integration guide
and the MCP server in
examples/mcp_claude_desktop.md.
How tierproxy compares
| tierproxy | Smartproxy SDK | Bright Data SDK | Oxylabs SDK | DataImpulse | |
|---|---|---|---|---|---|
| Multi-provider routing | ✅ | ❌ | ❌ | ❌ | ❌ |
| Client-side smart selector (cost-aware) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Live usage streaming (SSE) | ✅ | ❌ | ❌ | ❌ | ❌ |
| MCP server (Claude/Cursor/Cline) | ✅ | ❌ | ❌ | ❌ | ❌ |
| OpenTelemetry built-in | ✅ | ❌ | ❌ | ❌ | ❌ |
| Sync + async parity | ✅ | partial | partial | partial | partial |
| AI/ML framework examples shipped | 8 | 0 | 1 | 0 | 0 |
| Type-safe (Pydantic v2 + mypy strict) | ✅ | ❌ | ❌ | partial | ❌ |
| OpenAPI 3.1 spec | ✅ | ❌ | ❌ | ❌ | ❌ |
Pip-installable CLI (tierproxy doctor) |
✅ | ❌ | ❌ | ❌ | ❌ |
| Per-request cost attribution (lazy) | ✅ | ❌ | ❌ | ❌ | ❌ |
| JA3/JA4 TLS fingerprint rotation | ✅ | ❌ | ❌ | ❌ | ❌ |
| Rate-limit learning + auto-failover | ✅ | ❌ | ❌ | ❌ | ❌ |
| License | Apache 2.0 | proprietary | proprietary | proprietary | proprietary |
Features
- Five-second quickstart —
import tierproxy; tierproxy.get(url, country="US") - Layered API — five integration levels from one-liner to power-user knobs
- Smart routing —
routing="cheapest"auto-picks healthy upstream per request - Cost guardrails —
monthly_budget_usd=refuses requests that would exceed budget - Per-request cost attribution —
client.cost_for(resp)returns USD; lazy 30s cache, no per-request overhead - Client-side response caching —
cache_ttl=300, cache_max_response_size=262144LRU with size cap - Multi-provider auto-failover —
auto_failover=Trueretries with next-best upstream on 429/5xx - Rate-limit learning —
client.rate_limits.get()surfaces gateway-aggregated 429s per target domain - JA3/JA4 TLS rotation — per-upstream fingerprint randomization (gateway side; see tls-fingerprint guide)
- Cookie persistence — cookies stick to
session_idacross multi-step crawls - Streaming responses —
client.get(url, stream=True)returns iterator (large files, SSE) - Live SSE stream —
for delta in g.usage.stream()tails month-to-date bytes - MCP server —
tierproxy-mcpexposes proxy as tools to Claude/Cursor/Cline - 8 framework integrations — LangChain, LlamaIndex, Crawl4AI, Playwright, Firecrawl, Browser-Use, CrewAI
- OpenTelemetry opt-in —
pip install tierproxy[otel]for distributed tracing - Geo + sticky sessions — countries, cities, 1-1440min session pins
- Dual URL syntax — headers (httpx/requests) AND username-encoding (Playwright)
- Type-safe end-to-end — Pydantic v2 models, mypy strict, full IDE autocomplete
See examples/ for LangChain/LlamaIndex/Crawl4AI/Playwright and
examples/levels.py for a runnable demo of every level.
Use with your favorite AI/agent framework
| Framework | Example | Notes |
|---|---|---|
| LangChain | with_langchain.py |
RAG document loaders through proxy |
| LlamaIndex | with_llamaindex.py |
SimpleWebPageReader through proxy |
| Crawl4AI | with_crawl4ai.py |
Playwright crawler + tierproxy |
| Firecrawl (hot) | with_firecrawl.py |
Self-hosted Firecrawl + residential IPs |
| Browser-Use (hot) | with_browser_use.py |
LLM-driven autonomous browser |
| CrewAI (hot) | with_crewai.py |
Multi-agent scraper crew + cost-aware routing |
| Playwright | with_playwright.py |
Direct Playwright with tierproxy |
| MCP (Claude/Cursor/Cline/Windsurf) (unique) | mcp_claude_desktop.md |
Native tool integration via tierproxy-mcp |
MCP server (Claude Desktop / Cursor / Cline / Windsurf)
pip install tierproxy[mcp]
Then add to your MCP client config:
{
"mcpServers": {
"tierproxy": {
"command": "tierproxy-mcp",
"env": { "TIERPROXY_API_KEY": "tp_live_..." }
}
}
}
Now your AI assistant can call fetch_url(url, country="US"), inspect health
and usage, and route through the cheapest healthy upstream — no glue code,
no httpx imports, no boilerplate.
Install
Add tierproxy to your client. Pick the one you use.
claude mcp add tierproxy -- uvx tierproxycodex mcp add tierproxy -- uvx tierproxyamp mcp add tierproxy -- uvx tierproxy{
"mcpServers": {
"tierproxy": {
"command": "uvx",
"args": [
"tierproxy"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"tierproxy": {
"command": "uvx",
"args": [
"tierproxy"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"tierproxy","command":"uvx","args":["tierproxy"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"tierproxy": {
"command": "uvx",
"args": [
"tierproxy"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"tierproxy": {
"command": "uvx",
"args": [
"tierproxy"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"tierproxy": {
"command": "uvx",
"args": [
"tierproxy"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"tierproxy": {
"type": "local",
"command": "uvx",
"args": [
"tierproxy"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"tierproxy": {
"command": {
"path": "uvx",
"args": [
"tierproxy"
]
}
}
}
}Add to your Zed `settings.json`.
uvx tierproxyRun `goose configure`, choose **Add Extension → Command-line Extension**, and paste this command.
Score
39 / 100
Incomplete
- Documentation25/25
- Maintenance19/25
- Trust16/20
- Capability0/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 105 days ago
- Has a release history
- Repository is not archived
- Licensed Apache-2.0
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint — no local install
Version history
| Versions | Published |
|---|---|
| 0.4.0Latest | May 19, 2026 |
| 0.3.0 | May 18, 2026 |
| 0.2.0 | May 18, 2026 |
| 0.1.1 | May 17, 2026 |