remnawave-client
Sync and async client for the Remnawave API, generated from the panel's OpenAPI specification.
pip install remnawave-client
Requires Python 3.11 or newer.
Versions
The library version equals the API version it was generated from. A tag exists for every minor release of the panel from 2.0 onwards, so pin the one matching your deployment:
pip install remnawave-client==3.0.0
Quick start
from remnawave import Remnawave
with Remnawave("https://panel.example.com", token) as rw:
user = rw.users.get_user_by_username("zen")
print(user.username, user.status, user.expire_at)
for u in rw.users.iter_users():
print(u.username)
The async client mirrors it:
import asyncio
from remnawave import AsyncRemnawave
async def main() -> None:
async with AsyncRemnawave("https://panel.example.com", token) as rw:
stats = await rw.system.get_stats()
nodes = await rw.nodes.get_nodes()
async for user in rw.users.iter_users():
print(user.username)
asyncio.run(main())
More in examples/: pagination, partial updates, error handling,
webhooks and swapping out the client's parts.
Errors
Everything the library raises inherits from RemnawaveError. Below it the
hierarchy splits by cause: ApiError for anything the panel answered with,
TransportError when the request never got a reply, SerializationError when
the payload did not match the schema.
from remnawave.exceptions import NotFoundError
try:
rw.users.get_user_by_id(42)
except NotFoundError as error:
print(error.status, error.error_code) # 404 'A025'
error_code is the panel's own code and is more specific than the HTTP
status — branch on it when you need to tell cases apart.
Webhooks
from remnawave.webhooks import SIGNATURE_HEADER, WebhookReceiver
hooks = WebhookReceiver(secret=os.environ["WEBHOOK_SECRET_HEADER"])
event = hooks.receive(request.body, request.headers[SIGNATURE_HEADER])
if event.scope == "user":
print(event.event, event.data.username)
Pass the raw request body: the signature covers those exact bytes, so re-serialising parsed JSON breaks verification.
Regenerating
src/remnawave/_generated/ is machine-written and must not be edited by hand.
To target another panel version, drop its specification into specs/ and run:
python -m tools.codegen 3.4.3
Where the specification is wrong or awkward, overlay.yaml patches it before
generation: type names, forced field types, fields kept out of repr. Editing
the generated code directly would be lost on the next run; editing the vendored
specification would be lost on the next update.
Release files for remnawave-client 3.4.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| remnawave_client-3.4.3.1.tar.gz | 40.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| remnawave_client-3.4.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 105.5 kB
Release files / remnawave_client-3.4.3.1.tar.gz
| Download URL | remnawave_client-3.4.3.1.tar.gz |
|---|---|
| Size | 40.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f1405a8ab968f3ebf0b035d9d0704d7d99a0f6d68c7d60b57cd60f99533f6fd0
|
|
BLAKE2b-256 checksum How to use checksums |
85e9a42d9572ca81abeb41bd23adc2e44338cd96cc378490df47ac2c0cabd5a0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / remnawave_client-3.4.3.1-py3-none-any.whl
| Download URL | remnawave_client-3.4.3.1-py3-none-any.whl |
|---|---|
| Size | 64.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0c8cf6600d0a5500515955f0726c2bb1f258347815d9c9e3512e5257822d6932
|
|
BLAKE2b-256 checksum How to use checksums |
c81b5048c596b98493ec4e59a2c6dd59281c7a2fe4ac0923a7d41d338ab8bc3c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|