fromv2hubimportAsyncVPNClientasyncwithAsyncVPNClient("https://api.example.com","provider-api-token")asclient:connection=awaitclient.create_provider_connection(user_id=98765)print("Send this link to the user:",connection.connection_link)sub=awaitclient.create_subscription("welcome-vpn",sources=["vless://uuid@server1:443#Server1"],as_provider_for_user_id=98765,)print(f"Provisioned {sub.token} for user 98765")
Handling rate limits and retryable errors explicitly¶
fromv2hubimportAsyncVPNClient,RetryConfig,VPNAPIError,RateLimitErrorconfig=RetryConfig(max_retries=5,initial_delay=0.5)asyncwithAsyncVPNClient("https://api.example.com","your-api-token",retry_config=config)asclient:try:subs=awaitclient.list_subscriptions()exceptRateLimitErrorase:# Retries are already exhausted at this point (max_retries reached)print(f"Still rate limited after retries; wait {e.retry_after}s")exceptVPNAPIErrorase:print(f"{e} — {e.recovery_hint}")else:print(f"Fetched {len(subs)} subscriptions")
fromv2hubimportAsyncVPNClientasyncwithAsyncVPNClient("https://api.example.com","your-api-token")asclient:connections=awaitclient.list_connections()forconninconnections.connections:print(conn.provider_name,conn.status)awaitclient.approve_connection("trusted-provider")awaitclient.reject_connection("unwanted-provider")# ...later, if access is no longer needed:awaitclient.revoke_connection("trusted-provider")
# Keep the source resolvable internally, but exclude it from the public outputawaitclient.update_source(sub.token,config_id="cfg123",is_hidden=True)# Later, make it visible againawaitclient.update_source(sub.token,config_id="cfg123",is_hidden=False)