Skip to main content

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.8.tar.gz (37.8 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.8-py3-none-any.whl (27.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: v2hub-1.0.8.tar.gz
  • Upload date:
  • Size: 37.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for v2hub-1.0.8.tar.gz
Algorithm Hash digest
SHA256 61c9396e7ba949ebbeac0e4c21b54f72ecda782460a9717becc76640c64f6f8d
MD5 ed3b20ef1cd85d1b38aac0d4459801f9
BLAKE2b-256 ae5dbd91b464db62b6c6c6c8ed5fe1352655f492ae4ceb6646d3b6df4216dd56

See more details on using hashes here.

Provenance

The following attestation bundles were made for v2hub-1.0.8.tar.gz:

Publisher: publish.yml on nestthub/v2hub-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: v2hub-1.0.8-py3-none-any.whl
  • Upload date:
  • Size: 27.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for v2hub-1.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 e1b203e29042f4e4b842904243797ca96468536414bfb90dbe1fc9a5a08adfd5
MD5 a391157f055f681366f0e61ccd13e6ad
BLAKE2b-256 6c62ee938a9e94f585cc4fbcb88eb0fb29dcc4095159bf7fc52674ce9a2a50ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for v2hub-1.0.8-py3-none-any.whl:

Publisher: publish.yml on nestthub/v2hub-core

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.1.1

2 files

This release

1.0.8 This release

2 files

1.0.7

2 files

1.0.6

2 files

1.0.5

2 files

1.0.4

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