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==<your panel version>
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.
Regenerating it against the version the package declares takes no arguments:
python -m tools.codegen
To move the project onto a newer panel release, drop its specification into
specs/ and pass the version once:
python -m tools.codegen <version>
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.4
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.4.tar.gz | 41.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| remnawave_client-3.4.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 105.7 kB
Release files / remnawave_client-3.4.4.tar.gz
| Download URL | remnawave_client-3.4.4.tar.gz |
|---|---|
| Size | 41.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bd2a963c86beeaa36b7dca23cbc270960d747184d8475f1c276e47daf34af6b7
|
|
BLAKE2b-256 checksum How to use checksums |
8a5b77ee66bbbc0dacd3fe6fa4b08b8f0445a3d3bd04f9e23c660b520044aeb9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","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.4-py3-none-any.whl
| Download URL | remnawave_client-3.4.4-py3-none-any.whl |
|---|---|
| Size | 64.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b8b76a3f00425afdd430009e0c663b82c3e85ccbae46e3f46d56f2ba12162831
|
|
BLAKE2b-256 checksum How to use checksums |
91755419b2d7b737e2e7b7c051d8585aaf360176bbf4025eeac13d31e099c5f5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","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}
|