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.5.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.5-py3-none-any.whl
(26.6 kB
view details)
File details
Details for the file v2hub-1.0.5.tar.gz.
File metadata
- Download URL: v2hub-1.0.5.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 |
8dfd51e5e43efcea252d9c9db13362593b3682a26424251b1ff11f269a5dd61c
|
|
| MD5 |
49bd30482a790d1f7770aa66321bd48c
|
|
| BLAKE2b-256 |
47a6634685f5732deb7a9128c3ff4ab804575a1bbcd4ee6bcfce574d6073c044
|
File details
Details for the file v2hub-1.0.5-py3-none-any.whl.
File metadata
- Download URL: v2hub-1.0.5-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 |
ebaeb27af85256a6520392e6be1642ea226c827af22e950022553ce3f77c394b
|
|
| MD5 |
2b6714cd22dc5bb8e08fad05945cc153
|
|
| BLAKE2b-256 |
438caa08c90ad142230c96e4579061af08b44906168c0ce6e04c7dd1919d51cf
|