Skip to main content

remnawave-client

Sync and async client for the Remnawave API, generated from the panel's OpenAPI specification.

  • Every endpoint typed end to end — mypy --strict clean, py.typed shipped
  • The same surface synchronously and asynchronously
  • Listings walked lazily through iter_*
  • Webhook events parsed and their signatures verified
  • Transport, serializer, auth and retry policy are all replaceable
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
2.0.8  2.1.19  2.2.6  2.3.2  2.4.4  2.5.7  2.6.4
2.7.4  2.8.1   3.0.0  3.1.0  3.2.3  3.3.2  3.4.3

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 = rw.system.get_stats()
        nodes = 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 2.0.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for remnawave-client 2.0.8
File Size Uploaded
remnawave_client-2.0.8.tar.gz 25.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for remnawave-client 2.0.8
File Interpreter ABI Platform
remnawave_client-2.0.8-py3-none-any.whl Python 3 none any Details

Total release size: 68.3 kB

Release files / remnawave_client-2.0.8.tar.gz

Download URL remnawave_client-2.0.8.tar.gz
Size 25.4 kB
Tags Source
SHA-256 checksum
How to use checksums
66b3464788de15095f733e421df458ee03e15883c582af0895af659274b2fdd7
BLAKE2b-256 checksum
How to use checksums
fc220e81a163b4d85365010aa8d453f36ee33e53d8ecce5f44dd09b1154231a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / remnawave_client-2.0.8-py3-none-any.whl

Download URL remnawave_client-2.0.8-py3-none-any.whl
Size 42.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3d41adaa30f02a40f46235315365927ac95ce5b0844178850860f41d1026bf54
BLAKE2b-256 checksum
How to use checksums
558327a1e9aafb0d8c5af9861960ea2bdbb82554243cf76d2e11d0bb7d0d2595
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

3.4.4

2 release files

3.4.3

2 release files

3.3.2

2 release files

3.2.3

2 release files

3.1.0

1 release file

3.0.0

2 release files

2.8.1

2 release files

2.7.4

2 release files

2.6.4

1 release file

2.5.7

1 release file

2.4.4

2 release files

2.3.2

2 release files

2.2.6

2 release files

This release

2.0.8 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page