L402 client for AI agents — pay Lightning invoices automatically to access paywalled APIs
Project description
bolthub
L402 client for AI agents. Automatically handles 402 Payment Required challenges, pays Lightning invoices, and retries requests with proof of payment.
Install
pip install bolthub
Quick Start
from bolthub import L402Client, LndWallet
wallet = LndWallet(
host="https://your-lnd-node:8080",
macaroon="0201036c6e...",
)
client = L402Client(wallet, budget_sats=10_000)
resp = client.get(
"https://acme.gw.bolthub.ai/v1/market-data",
params={"symbol": "BTC"},
)
data = resp.json()
Wallet Adapters
LND (recommended)
Full Lightning node. Self-host or use the bolthub Node Launcher, Umbrel, or Start9. Fastest payment path (<200ms) and full control.
from bolthub import LndWallet
wallet = LndWallet(
host="https://your-lnd-node:8080",
macaroon="admin-macaroon-hex",
timeout_seconds=30,
)
For agent deployments, use a scoped pay-only macaroon instead of admin.macaroon:
lncli bakemacaroon uri:/lnrpc.Lightning/SendPaymentSync \
uri:/lnrpc.Lightning/DecodePayReq \
--save_to=pay-only.macaroon
NWC (Nostr Wallet Connect)
Easiest to set up but slower (1-3s per payment). No node required. Get a free NWC connection from CoinOS or use Alby Hub, Zeus, or Primal.
from bolthub import NwcWallet
# Provide a pay function that handles the NWC protocol.
# With pynostr or another NWC library:
def pay_via_nwc(bolt11: str) -> str:
# your NWC payment logic here
return preimage_hex
wallet = NwcWallet(pay_fn=pay_via_nwc)
LNbits
Supported if you already run LNbits. Multi-wallet accounts system; create a dedicated wallet for your agent.
from bolthub import LnbitsWallet
wallet = LnbitsWallet(
url="https://lnbits.example.com",
admin_key="your-admin-key",
)
Phoenixd
Supported if you already run Phoenixd for outbound payments.
from bolthub import PhoenixdWallet
wallet = PhoenixdWallet(
url="https://your-phoenixd:9740",
password="your-phoenixd-password",
timeout_seconds=35,
)
Custom Wallet
Implement the WalletAdapter protocol:
class MyWallet:
def pay_invoice(self, bolt11: str) -> str:
preimage = my_payment_logic(bolt11)
return preimage
Budget Guards
client = L402Client(
wallet,
max_per_request_sats=100, # reject invoices over 100 sats
budget_sats=10_000, # total spending cap
)
print(client.total_spent) # sats spent so far
print(client.remaining_budget) # sats remaining
Session Persistence
By default sessions are kept in memory. Use FileSessionStore to persist
tokens across process restarts (stored in ~/.bolthub/sessions.json):
from bolthub import L402Client, LndWallet, FileSessionStore
client = L402Client(
LndWallet(host=host, macaroon=macaroon),
session_store=FileSessionStore(),
)
API Reference
| Export | Description |
|---|---|
L402Client |
HTTP client with automatic L402 challenge handling |
LndWallet |
Wallet adapter for LND REST API |
LnbitsWallet |
Wallet adapter for LNbits |
PhoenixdWallet |
Wallet adapter for Phoenixd |
NwcWallet |
Wallet adapter accepting a custom pay callback |
WalletAdapter |
Protocol to implement for custom wallets |
FileSessionStore |
Disk-backed session token persistence |
SessionStore |
Protocol for custom session storage |
L402Error |
Base exception for L402 failures |
L402BudgetError |
Raised when budget limits are exceeded |
License
MIT
Project details
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 bolthub-0.1.1.tar.gz.
File metadata
- Download URL: bolthub-0.1.1.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45e7d4dcb5e84899018c3aad5ca53eb259441701c9e31a6b1b3a2f924220b2de
|
|
| MD5 |
cfea5888df93dc329cffb22d90686f0f
|
|
| BLAKE2b-256 |
84714f51da4b315ff2b080949929113f6cfc31d319e97f9aace8688ac3ff295e
|
Provenance
The following attestation bundles were made for bolthub-0.1.1.tar.gz:
Publisher:
publish.yml on signaltech-org/bolthub-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bolthub-0.1.1.tar.gz -
Subject digest:
45e7d4dcb5e84899018c3aad5ca53eb259441701c9e31a6b1b3a2f924220b2de - Sigstore transparency entry: 1776305498
- Sigstore integration time:
-
Permalink:
signaltech-org/bolthub-sdk@2c200f6319c2f8b7c3a3379e6c525a9eb9ab7534 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/signaltech-org
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2c200f6319c2f8b7c3a3379e6c525a9eb9ab7534 -
Trigger Event:
push
-
Statement type:
File details
Details for the file bolthub-0.1.1-py3-none-any.whl.
File metadata
- Download URL: bolthub-0.1.1-py3-none-any.whl
- Upload date:
- Size: 8.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1761b8d98e917c6b39ac616ad31df86ffbf85aab67ac8283772c3c82528c3c7
|
|
| MD5 |
773c371b8bbd52748038d930e22d9b88
|
|
| BLAKE2b-256 |
14639cadc79bb113c76418ca8f79262264be1d3c6259c176e80fb3f58e3f308b
|
Provenance
The following attestation bundles were made for bolthub-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on signaltech-org/bolthub-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bolthub-0.1.1-py3-none-any.whl -
Subject digest:
d1761b8d98e917c6b39ac616ad31df86ffbf85aab67ac8283772c3c82528c3c7 - Sigstore transparency entry: 1776305600
- Sigstore integration time:
-
Permalink:
signaltech-org/bolthub-sdk@2c200f6319c2f8b7c3a3379e6c525a9eb9ab7534 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/signaltech-org
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2c200f6319c2f8b7c3a3379e6c525a9eb9ab7534 -
Trigger Event:
push
-
Statement type: