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

Uploaded Python 3

File details

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

File metadata

  • Download URL: v2hub-1.0.7.tar.gz
  • Upload date:
  • Size: 37.0 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.7.tar.gz
Algorithm Hash digest
SHA256 53d0a67824b775c898f7eb832230446c0e76fd3030c2660ea49f1221198599dc
MD5 825bf2f471ad232c71ebcb45361819e0
BLAKE2b-256 cc9348a24addca79bee86f1ee3f8eed0d2902d6e984831da3166eb01807fc71e

See more details on using hashes here.

Provenance

The following attestation bundles were made for v2hub-1.0.7.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.7-py3-none-any.whl.

File metadata

  • Download URL: v2hub-1.0.7-py3-none-any.whl
  • Upload date:
  • Size: 26.8 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.7-py3-none-any.whl
Algorithm Hash digest
SHA256 fc7495df87c4633e201fab84e970d377580d6c2a24bf1b71e81ec32cec4ee9fe
MD5 4ac01fdb3b96ceda4a5954d2ac156923
BLAKE2b-256 3d3b76bfd6930610ef11f0c60d4683fdb0171cc82d50ece89e7cb655187c2135

See more details on using hashes here.

Provenance

The following attestation bundles were made for v2hub-1.0.7-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

1.0.8

2 files

This release

1.0.7 This release

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