A modern async Python client for the Pasarguard API with typed models and full admin automation support
Project description
Pasarguard
Pasarguard is a modern, typed, async Python client for the Pasarguard API.
It provides a clean interface for authentication, users, admins, nodes, groups, hosts, templates, subscriptions, settings, system stats, and bulk operations. The client is powered by httpx.AsyncClient and Pydantic v2 models.
Installation
pip install pasarguard
uv add pasarguard
Features
- Async-first API client.
- Typed request and response models with Pydantic v2.
- Bearer-token authentication.
- Optional SSH tunnel support.
- User, admin, node, group, host, core, template, and subscription management.
- Bulk operations for users, admins, nodes, groups, hosts, and templates.
- Usage metrics, realtime node stats, inbound details, and worker health endpoints.
Compatibility
- Python
>=3.10,<3.15 - Windows, macOS, and Linux
httpx>=0.28.1pydantic>=2.4.1,<2.13
Quick Start
import asyncio
import os
from pasarguard import PasarguardAPI, UserCreate, UserStatus
async def main() -> None:
async with PasarguardAPI(
base_url=os.environ["PASARGUARD_BASE_URL"],
verify=True,
timeout=20.0,
) as api:
token = await api.get_token(
username=os.environ["PASARGUARD_ADMIN_USERNAME"],
password=os.environ["PASARGUARD_ADMIN_PASSWORD"],
)
user = await api.create_user(
UserCreate(
username="customer-1001",
data_limit=50 * 1024**3,
expire=30,
status=UserStatus.ACTIVE,
group_ids=[1],
note="Created by automation",
),
token=token.access_token,
)
print(user.id, user.username, user.subscription_url)
asyncio.run(main())
Authentication
token = await api.get_token(
username=os.environ["PASARGUARD_ADMIN_USERNAME"],
password=os.environ["PASARGUARD_ADMIN_PASSWORD"],
)
admin = await api.get_current_admin(token=token.access_token)
print(admin.username, admin.is_sudo)
admin_token() is also available as an alias for get_token().
Client Initialization
Basic client:
api = PasarguardAPI(
base_url=os.environ["PASARGUARD_BASE_URL"],
timeout=10.0,
verify=True,
)
With an SSH tunnel:
api = PasarguardAPI(
base_url="http://127.0.0.1:8000",
ssh_host=os.environ["PASARGUARD_SSH_HOST"],
ssh_username=os.environ["PASARGUARD_SSH_USERNAME"],
ssh_private_key_path=os.environ["PASARGUARD_SSH_KEY_PATH"],
local_bind_host="127.0.0.1",
local_bind_port=8000,
remote_bind_host="127.0.0.1",
remote_bind_port=8000,
)
Common Usage
List Users
from pasarguard import UserStatus
users = await api.get_users(
token=token,
offset=0,
limit=50,
status=UserStatus.ACTIVE,
load_sub=True,
)
for user in users.users:
print(user.username, user.used_traffic)
Modify a User
from pasarguard import UserModify
user = await api.modify_user(
username="customer-1001",
user=UserModify(note="Renewed monthly plan"),
token=token,
)
Bulk Disable Users
from pasarguard import BulkUsersSelection
result = await api.bulk_disable_users(
BulkUsersSelection(ids=[101, 102, 103]),
token=token,
)
print(result.count, result.users)
Subscription Info
from pasarguard import ConfigFormat
info = await api.user_subscription_info(token="subscription-token-value")
links = await api.get_user_subscription_with_client_type(
token="subscription-token-value",
client_type=ConfigFormat.LINKS,
)
print(info.username)
print("\n".join(links))
Node Stats
stats = await api.realtime_node_stats(node_id=1, token=token)
print(stats.cpu_usage, stats.mem_used)
Error Handling
Pasarguard uses httpx internally. HTTP errors are raised as httpx.HTTPStatusError.
import httpx
try:
user = await api.get_user("customer-1001", token=token)
except httpx.HTTPStatusError as exc:
print(exc.response.status_code)
print(exc.response.text)
except httpx.RequestError as exc:
print(f"Network error: {exc}")
Pagination
Endpoints that return lists commonly support offset and limit.
offset = 0
limit = 100
while True:
page = await api.get_users(token=token, offset=offset, limit=limit)
for user in page.users:
print(user.username)
offset += limit
if offset >= page.total:
break
API Overview
Main public client: PasarguardAPI
Important method groups:
- Authentication:
get_token(),admin_token() - Users:
create_user(),get_user(),get_users(),modify_user(),remove_user() - User bulk actions:
bulk_delete_users(),bulk_disable_users(),bulk_enable_users(),bulk_reset_users_data_usage() - Admins:
get_current_admin(),create_admin(),get_admins(),modify_admin(),remove_admin() - Nodes:
create_node(),get_nodes(),realtime_node_stats(),sync_node(),reconnect_node() - Groups:
create_group(),get_all_groups(),modify_group(),remove_group() - Hosts:
create_host(),get_hosts(),modify_host(),remove_host() - Cores:
create_core_config(),get_all_cores(),restart_core() - Templates:
create_user_template(),create_client_template() - Subscriptions:
user_subscription_info(),user_subscription_with_client_type() - Settings and system:
get_settings(),modify_settings(),get_system_stats(),get_workers_health()
Common public models:
UserCreate,UserModify,UserResponse,UsersResponseAdminCreate,AdminModify,AdminDetailsNodeCreate,NodeModify,NodeResponseGroupCreate,GroupModify,GroupResponseCreateHost,BaseHostCoreCreate,CoreResponseSettingsSchema,SubscriptionUserResponse
Common enums:
UserStatusPeriodConfigFormatDataLimitResetStrategyNodeStatusNodeConnectionTypeCoreType
License
This project is licensed under the MIT License. See LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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
File details
Details for the file pasarguard-2.0.1.tar.gz.
File metadata
- Download URL: pasarguard-2.0.1.tar.gz
- Upload date:
- Size: 92.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
67fe510e7e368b8a7b538861ac80e89f2e75e627073c4f8395596da79a3b72f3
|
|
| MD5 |
8b23b921f7a501e1ca161ce2f2df84c5
|
|
| BLAKE2b-256 |
a6470108e8abc8c11172ac0b8697762040c9b7a81479f516ad96fb2ea48beca4
|
File details
Details for the file pasarguard-2.0.1-py3-none-any.whl.
File metadata
- Download URL: pasarguard-2.0.1-py3-none-any.whl
- Upload date:
- Size: 41.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7c765b9541744edc6b9d2059402e81cf4cbb93df99591f849f0a5cf4dbfcf88
|
|
| MD5 |
09db9cf3c9a042df0d8eee1be840df25
|
|
| BLAKE2b-256 |
d26a58e80ce0a2da1110776dad95e0756f388b0ba4baeed4ad3e2c8eba72125b
|