V2Hub - VPN Subscription API Client
Professional Python client library for VPN Subscription API with async/sync support, comprehensive error handling, and production-ready features.
Features
- 🚀 Async & Sync: Both
AsyncVPNClientandVPNClient(sync wrapper) - 📦 Pydantic Models: Full type safety and validation with Pydantic v2
- 🔄 Smart Retry: Exponential backoff with jitter and circuit breaker
- 🛡️ Exception Hierarchy: 11 typed exceptions with
is_retryableandrecovery_hint - 🎯 Type Safe: Full type hints for IDE support
- 📊 Production Ready: Logging, observability, and middleware support
Installation
pip install v2hub
Quick Start
Async Usage
from v2hub import AsyncVPNClient
async with AsyncVPNClient("https://api.example.com", "your-api-token") as client:
# Create subscription
sub = await client.create_subscription("my-vpn")
# Add sources
await client.add_sources(sub.token, ["vless://server1", "vmess://server2"])
# Get subscription config
config = await client.get_subscription_config(sub.token)
print(config)
Sync Usage
from v2hub import VPNClient
with VPNClient("https://api.example.com", "your-api-token") as client:
# Create subscription
sub = client.create_subscription("my-vpn")
# Add sources
client.add_sources(sub.token, ["vless://server1"])
# List subscriptions
subs = client.list_subscriptions()
for s in subs:
print(f"{s.name}: {s.token}")
Error Handling
from v2hub import (
AsyncVPNClient,
VPNAPIError,
RateLimitError,
NotFoundError,
)
async with AsyncVPNClient(base_url, token) as client:
try:
sub = await client.get_subscription("token123")
except NotFoundError:
print("Subscription not found")
except RateLimitError as e:
print(f"Rate limited. Retry after: {e.retry_after}")
except VPNAPIError as e:
if e.is_retryable:
print(f"Retryable error: {e.recovery_hint}")
else:
print(f"Permanent error: {e}")
Configuration
Retry Configuration
from v2hub import AsyncVPNClient, RetryConfig
config = RetryConfig(
max_retries=5,
initial_delay=1.0,
max_delay=60.0,
exponential_base=2,
jitter=True,
)
client = AsyncVPNClient(
base_url="https://api.example.com",
api_token="your-token",
retry_config=config,
)
Circuit Breaker
from v2hub import AsyncVPNClient, CircuitBreakerConfig
breaker = CircuitBreakerConfig(
failure_threshold=5,
recovery_timeout=60.0,
expected_exception=VPNAPIError,
)
client = AsyncVPNClient(
base_url="https://api.example.com",
api_token="your-token",
circuit_breaker_config=breaker,
)
API Coverage
Subscriptions
create_subscription(name, comment?)- Create new subscriptionget_subscription(token)- Get subscription detailslist_subscriptions()- List all subscriptionsupdate_subscription(token, name?, comment?)- Update subscriptiondelete_subscription(token)- Delete subscriptionrefresh_subscription(token)- Refresh subscription config
Sources
add_sources(token, uris)- Add source URIsreplace_sources(token, uris)- Replace all sourcesremove_sources(token, uris)- Remove specific sourcesget_sources(token)- Get all sources for subscription
Public Access
get_subscription_config(token)- Get public subscription config (no auth)get_public_info(token)- Get public subscription metadata (no auth)
Development
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Type checking
mypy src/
# Linting
ruff check src/
Extensions
- v2hub-admin: Admin API extension with HMAC authentication
- v2hub-cli: Beautiful command-line interface
License
MIT License - see LICENSE file for details.
Author
nestt
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
v2hub-1.0.6.tar.gz
(36.2 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
v2hub-1.0.6-py3-none-any.whl
(26.6 kB
view details)
File details
Details for the file v2hub-1.0.6.tar.gz.
File metadata
- Download URL: v2hub-1.0.6.tar.gz
- Upload date:
- Size: 36.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6820def35fd37c4c4eba53ccd753af3e2d1602d7010c19e72a94c11a892f7ca
|
|
| MD5 |
a69a5ce5bfef02a51db82635b222ae4b
|
|
| BLAKE2b-256 |
694610b83922b3385194981caf813102d4e1cfc393e59b74fa50a6452004d74b
|
File details
Details for the file v2hub-1.0.6-py3-none-any.whl.
File metadata
- Download URL: v2hub-1.0.6-py3-none-any.whl
- Upload date:
- Size: 26.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b91876dc07378ae1d99e861600e4cd167d17d20841d6d54df7b2d6c5f5df266
|
|
| MD5 |
177836ccd37ac0736678fc933996812a
|
|
| BLAKE2b-256 |
8208d7896a0eeb57ae2af3034f467bdf019d10b0e00e459cea068d25c4310907
|