Skip to main content
Yanked

This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 1.1.1 instead.
Reason given by maintainers: update_source used incorrect defaults, breaking true partial-update semantics. Fixed in 1.0.5.

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 AsyncVPNClient and VPNClient (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_retryable and recovery_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 subscription
  • get_subscription(token) - Get subscription details
  • list_subscriptions() - List all subscriptions
  • update_subscription(token, name?, comment?) - Update subscription
  • delete_subscription(token) - Delete subscription
  • refresh_subscription(token) - Refresh subscription config

Sources

  • add_sources(token, uris) - Add source URIs
  • replace_sources(token, uris) - Replace all sources
  • remove_sources(token, uris) - Remove specific sources
  • get_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.4.tar.gz (36.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

v2hub-1.0.4-py3-none-any.whl (26.3 kB view details)

Uploaded Python 3

File details

Details for the file v2hub-1.0.4.tar.gz.

File metadata

  • Download URL: v2hub-1.0.4.tar.gz
  • Upload date:
  • Size: 36.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for v2hub-1.0.4.tar.gz
Algorithm Hash digest
SHA256 9aae451198492114890ecc1fc953778378b190258a6ebb03061ffc1494630fc6
MD5 c97a1af94b1e6dbf2d26212831da0734
BLAKE2b-256 efa9aee9ca68ad509d2a57b9db4f535e5eae4a70d8ed5eb823c6e1123738c1f4

See more details on using hashes here.

File details

Details for the file v2hub-1.0.4-py3-none-any.whl.

File metadata

  • Download URL: v2hub-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 26.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for v2hub-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 b6f2d154865c89a0f516b737ec75fd72a250b884120a5c0fb930c313112cfb3c
MD5 59a2de82af809f11c266ac039fa339cd
BLAKE2b-256 b17983b7cc65ff13dceb3bf0d9b8ac2c6be363ba839cb2fb3391e1882f973e02

See more details on using hashes here.

Release history Release notifications | RSS feed

1.1.1

2 files

1.0.8

2 files

1.0.7

2 files

1.0.6

2 files

1.0.5

2 files

This release

1.0.4 This release

2 files

1.0.3

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page