Skip to main content

arcticbison-rudis

Official Python SDK for Rudis — the open-source crypto invoice and billing notifier supporting Lightning Network, Bitcoin on-chain, and Monero.

Installation

pip install arcticbison-rudis

Quick start

import os
from rudis import RudisClient

client = RudisClient(
    base_url='https://your-rudis-instance.example.com',
    api_key=os.environ['RUDIS_API_KEY'],
)

# Create a Lightning invoice
invoice = client.invoices.create(
    customer_id='user-42',
    amount_sats=21000,
    rail='LN',
    metadata={'plan_id': 'operator', 'billing_period': 'monthly'},
)
print(invoice.bolt11)  # lnbc...

# Poll until paid or expired
settled = client.invoices.poll(invoice.id)
if settled.status == 'paid':
    print('Payment confirmed:', settled.paid_at)

Invoices

# Create — Lightning
invoice = client.invoices.create(customer_id='user-42', amount_sats=21000, rail='LN')
# Create — Bitcoin on-chain
invoice = client.invoices.create(customer_id='user-42', amount_sats=21000, rail='BTC')
# Create — Monero
invoice = client.invoices.create(customer_id='user-42', amount_sats=21000, rail='XMR')

# Get
invoice = client.invoices.get('inv_...')

# List (optionally filter by customer)
all_invoices = client.invoices.list()
user_invoices = client.invoices.list(customer_id='user-42')

# Poll until settled (polls every 3s, up to 100 attempts by default)
settled = client.invoices.poll('inv_...', interval=3.0, max_attempts=100)

Subscriptions

# Register subscription (call after first payment to enable auto-renewal)
sub = client.subscriptions.create(
    customer_id='user-42',
    plan_id='altostratus-operator',
    billing_period='monthly',
    rail='LN',
    webhook_url='https://your-app.example.com/webhooks/rudis',
    webhook_secret=os.environ['WEBHOOK_SECRET'],
)

# Get
sub = client.subscriptions.get('sub_...')

# List
all_subs = client.subscriptions.list()

# Cancel
sub = client.subscriptions.cancel('sub_...')

Webhook verification

# Flask example
from flask import Flask, request, abort
from rudis.webhook import verify_signature, parse_event

app = Flask(__name__)

@app.route('/webhooks/rudis', methods=['POST'])
def rudis_hook():
    sig = request.headers.get('X-Rudis-Signature', '')
    body = request.get_data()

    if not verify_signature(body, sig, os.environ['WEBHOOK_SECRET']):
        abort(401)

    event = parse_event(body)

    if event.type == 'invoice.paid':
        # activate subscription
        pass
    elif event.type == 'subscription.suspended':
        # revoke access
        pass

    return '', 200
# FastAPI example
from fastapi import FastAPI, Request, HTTPException
from rudis.webhook import verify_signature, parse_event

app = FastAPI()

@app.post('/webhooks/rudis')
async def rudis_hook(request: Request):
    body = await request.body()
    sig  = request.headers.get('x-rudis-signature', '')

    if not verify_signature(body, sig, os.environ['WEBHOOK_SECRET']):
        raise HTTPException(status_code=401)

    event = parse_event(body)
    # dispatch on event.type...
    return {'ok': True}

Async client

import asyncio
from rudis import AsyncRudisClient

async def main():
    async with AsyncRudisClient(
        base_url='https://your-rudis-instance.example.com',
        api_key=os.environ['RUDIS_API_KEY'],
    ) as client:
        invoice = await client.invoices.create(
            customer_id='user-42',
            amount_sats=21000,
            rail='LN',
        )
        settled = await client.invoices.poll(invoice.id)
        print(settled.status)

asyncio.run(main())

Context manager

with RudisClient(base_url=..., api_key=...) as client:
    invoices = client.invoices.list('user-42')

Error handling

from rudis import RudisError

try:
    invoice = client.invoices.get('inv_nonexistent')
except RudisError as e:
    print(e.status_code)  # 404
    print(e.body)         # {"message": "Invoice not found"}

Self-hosted Rudis

Point base_url at your self-hosted instance:

client = RudisClient(base_url='http://localhost:3000', api_key=os.environ['INVOICE_API_KEY'])

Requirements

  • Python 3.9+
  • httpx (installed automatically)

License

MIT — same as Rudis itself.

Metadata

Release files for arcticbison-rudis 0.1.0

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

Source distribution (sdist)

Source distribution for arcticbison-rudis 0.1.0
File Size Uploaded Provenance Actions
arcticbison_rudis-0.1.0.tar.gz 7.0 kB Without provenance Details for arcticbison_rudis-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for arcticbison-rudis 0.1.0
File Interpreter ABI Platform Actions
arcticbison_rudis-0.1.0-py3-none-any.whl Python 3 none any Details for arcticbison_rudis-0.1.0-py3-none-any.whl

Total release size: 16.0 kB

Release files / arcticbison_rudis-0.1.0.tar.gz

Download URL arcticbison_rudis-0.1.0.tar.gz
Size 7.0 kB
Tags Source
SHA-256 checksum
How to use checksums
4ed8b7b2d6a54fe7de93dad654c5640b08b1df243fa57e399c9bd819113d6142
BLAKE2b-256 checksum
How to use checksums
a1d887817446e9a24223aea51e0bf008f7c13ea404ac70a21ad3cf624e22bd8b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Release files / arcticbison_rudis-0.1.0-py3-none-any.whl

Download URL arcticbison_rudis-0.1.0-py3-none-any.whl
Size 9.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
484dfef765204509993479a68010c97315988c7de43afbea4dca05f755d8fa0a
BLAKE2b-256 checksum
How to use checksums
b86e57c01c21112fec255cc944f14557fd3516f1959aad6e621377371373c624
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Security for arcticbison-rudis 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

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