Professional Python client for VPN Subscription API
Project description
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
Project details
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.1.tar.gz
(17.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.1-py3-none-any.whl
(23.8 kB
view details)
File details
Details for the file v2hub-1.0.1.tar.gz.
File metadata
- Download URL: v2hub-1.0.1.tar.gz
- Upload date:
- Size: 17.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 |
22a1a6f10b875ebf80b938f9f1d8dae0361b1f335e62a32cac4236200d235675
|
|
| MD5 |
d33534aa853d0773d7b497f9839800ac
|
|
| BLAKE2b-256 |
6560c1a9d2fe71f03dfd68dc21528ece5eab759433266c0a57bb4581d09a294e
|
File details
Details for the file v2hub-1.0.1-py3-none-any.whl.
File metadata
- Download URL: v2hub-1.0.1-py3-none-any.whl
- Upload date:
- Size: 23.8 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 |
c879de351a14c5a72cee0737ae74b8b987ad86502ce1323f07a03626afb85d3a
|
|
| MD5 |
ed07fa21882f9d9e6876e41f01f5e261
|
|
| BLAKE2b-256 |
0c1d36813dc3851fbd55694025c8f6abecd7f4e03d57a4deb94f54c986f4ddb3
|