About l402-kit
l402-kit provides payment middleware and agent clients for APIs using L402, with Bitcoin Lightning payments; it also supports x402 compatibility. Its MCP server lets compatible agents access this payment flow for paid API calls.
Key features
- 01L402 payment handling for APIs
- 02Bitcoin Lightning invoice verification
- 03Agent client with session budgets
- 04Replay protection and expiring macaroons
- 05TypeScript, Python, Go, and Rust SDKs
Use cases
- 01Charge per API call in sats
- 02Let agents pay for protected API endpoints
- 03Verify Lightning payments before serving data
- 04Integrate L402 into supported server runtimes
MCP support
The MCP server makes l402-kit available to MCP-compatible agents for L402-protected API calls. The README also notes x402 compatibility.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
12Saved tool list · updated 2w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | The URL to fetch (http or https) |
| body | string | No | Request body as string (for POST/PUT requests) |
| method | string | No | HTTP method — GET, POST, PUT, DELETE, PATCH. Default: GET |
| headers | object | No | Additional HTTP request headers as key-value pairs |
Details
From the project READMEl402-kit
Add Bitcoin Lightning pay-per-call to any API. 3 lines of code.
▶ Watch end-to-end demo — install → 402 → pay → 200 OK
Live traction
| SDK | Version | Downloads |
|---|---|---|
| 📦 TypeScript · npmjs.com/package/l402-kit | ||
| 🐍 Python · pypi.org/project/l402kit | ||
| 🦀 Rust · crates.io/crates/l402kit | ||
| 🔌 VS Code Extension · marketplace | ||
| 🦫 Go · pkg.go.dev |
🌍 Available in 11 languages — click to expand
🇺🇸 Charge for your API in Bitcoin Lightning. 3 lines of code. 🇧🇷 Monetize sua API com Bitcoin Lightning. 3 linhas de código. 🇪🇸 Monetiza tu API con Bitcoin Lightning. 3 líneas de código. 🇨🇳 用 3 行代码,通过比特币闪电网络收费。 🇮🇳 अपने API को Bitcoin Lightning से 3 लाइनों में मोनेटाइज़ करें। 🇸🇦 اكسب من API الخاص بك عبر Bitcoin Lightning. 3 أسطر فقط. 🇫🇷 Monétisez votre API en Bitcoin Lightning. 3 lignes de code. 🇩🇪 Monetarisiere deine API mit Bitcoin Lightning. 3 Zeilen Code. 🇷🇺 Монетизируй свой API через Bitcoin Lightning. 3 строки кода. 🇯🇵 Bitcoin LightningでAPIを3行で収益化。 🇮🇹 Monetizza la tua API con Bitcoin Lightning. 3 righe di codice.
📖 Official docs: 🇺🇸 · 🇧🇷 · 🇪🇸 · 🇨🇳 · 🇮🇳 · 🇸🇦 · 🇫🇷 · 🇩🇪 · 🇷🇺 · 🇯🇵 · 🇮🇹
Install
npm install l402-kit # TypeScript / Node.js / Express
pip install l402kit # Python / FastAPI / Flask
go get github.com/shinydapps/l402-kit/[email protected] # Go / net/http / Chi / Gin
cargo add l402kit # Rust / axum
AI Agents / LLMs: See
llms.txtfor machine-readable instructions. Agent discovery:/.well-known/agent.json·/.well-known/l402.json
For AI Agents
l402-kit is the payment layer for autonomous agents. Agents can pay for APIs without human intervention.
System prompt snippet — add this to any agent to enable L402 payments:
You have access to paid APIs via the L402 protocol.
When you call an API that returns HTTP 402, use the L402Client from l402-kit
to pay automatically with Bitcoin Lightning.
Budget limit: {BUDGET_SATS} sats per session. Never exceed this limit.
Agent SDK quickstart:
import { l402Client, buildWallet } from "l402-kit/agent";
const client = l402Client({
wallet: buildWallet(process.env), // auto-detects BLINK_API_KEY or ALBY_TOKEN
budgetSats: 1000,
});
const data = await client.fetch("https://api.example.com/paid-endpoint");
MCP Server (for Claude Desktop, Cursor, and any MCP-compatible agent):
{
"mcpServers": {
"l402-kit": {
"command": "npx",
"args": ["l402-kit-mcp"],
"env": { "BLINK_API_KEY": "your-key" }
}
}
}
Compatible with: LangChain · OpenAI Agents · CrewAI · Vercel AI SDK · AutoGPT · Any MCP client
Protocol support: L402 (Bitcoin Lightning) · x402 (USDC/Coinbase) compatible
How it works
1. Client calls your API
↓
2. API returns HTTP 402 + BOLT11 invoice + macaroon
↓
3. Client pays (any Lightning wallet, < 1 second, any country)
↓
4. Client sends Authorization: L402 <macaroon>:<preimage>
↓
5. API verifies SHA256(preimage) == paymentHash ✓
↓
6. HTTP 200 OK + your data
── Fee flow (managed mode) ─────────────────────────────────
Payment → 99.7% → your Lightning Address (instant)
→ 0.3% → ShinyDapps
Quickstart
TypeScript
import express from "express";
import { l402, AlbyProvider } from "l402-kit";
const app = express();
const lightning = new AlbyProvider(process.env.ALBY_TOKEN!);
app.get("/premium", l402({ priceSats: 100, lightning }), (_req, res) => {
res.json({ data: "Payment confirmed." });
});
app.listen(3000);
Python
from fastapi import FastAPI, Request
from l402kit import l402_required
app = FastAPI()
@app.get("/premium")
@l402_required(price_sats=100, owner_lightning_address="[email protected]")
async def premium(request: Request):
return {"data": "Payment confirmed."}
Go
package main
import (
"fmt"
"net/http"
l402kit "github.com/shinydapps/l402-kit/go"
)
func main() {
http.Handle("/premium", l402kit.Middleware(l402kit.Options{
PriceSats: 100,
OwnerLightningAddress: "[email protected]",
}, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, `{"data": "Payment confirmed."}`)
})))
http.ListenAndServe(":8080", nil)
}
Rust
use axum::{middleware, routing::get, Router};
use l402kit::{l402_middleware, Options};
use std::sync::Arc;
#[tokio::main]
async fn main() {
let opts = Arc::new(Options::new(100).with_address("[email protected]"));
let app = Router::new()
.route("/premium", get(|| async { "Payment confirmed." }))
.route_layer(middleware::from_fn_with_state(opts, l402_middleware));
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Test it live
# Step 1 — triggers 402 + returns invoice
curl http://localhost:3000/premium
# ← { "error": "Payment Required", "invoice": "lnbc1u...", "macaroon": "eyJ..." }
# Step 2 — pay the invoice with any Lightning wallet, then:
curl http://localhost:3000/premium \
-H "Authorization: L402 <macaroon>:<preimage>"
# ← { "data": "Payment confirmed." }
Why not Stripe?
| Stripe | l402-kit | |
|---|---|---|
| Minimum fee | $0.30 | < 1 sat (~$0.001) |
| Settlement time | 2–7 days | < 1 second |
| Chargebacks | Yes | Impossible — cryptographic proof |
| Requires account | Yes | No — any Lightning wallet |
| AI agent support | No | Yes — 4 SDKs, native |
| Countries blocked | ~50 | 0 — global by default |
| Reversible | Yes | No — final on receipt |
| Open source | No | Yes — MIT |
Providers
import { BlinkProvider, OpenNodeProvider, LNbitsProvider } from "l402-kit";
// Blink (recommended — free, instant setup)
const provider = new BlinkProvider(process.env.BLINK_API_KEY!, process.env.BLINK_WALLET_ID!);
// OpenNode (production, custodial)
const provider = new OpenNodeProvider(process.env.OPENNODE_KEY!);
// LNbits (self-hosted)
const provider = new LNbitsProvider(process.env.LNBITS_KEY!, "https://your.lnbits.host");
Bring your own node — implement the LightningProvider interface in 5 lines:
import type { LightningProvider } from "l402-kit";
class MyNode implements LightningProvider {
async createInvoice(amountSats: number) { /* return Invoice */ }
async checkPayment(paymentHash: string) { /* return boolean */ }
}
Security model
Invoice creation: paymentHash = SHA256(preimage)
Client payment: Lightning Network releases preimage to payer
API verification: SHA256(preimage) == paymentHash ✓
Replay protection: each preimage is marked used — works exactly once
Token expiry: macaroons expire after 1 hour
- Unforgeable — SHA256 is a one-way function; you cannot fake a preimage
- No chargebacks — cryptographic settlement, not reversible card auth
- Replay-safe — MemoryReplayAdapter (dev) or RedisReplayAdapter (production, multi-instance)
- 600+ automated tests across 5 runtimes (TS, Python, Go, Rust, Cloudflare Workers) — production-grade reliability for autonomous agent workflows
- Fully auditable — MIT, every line open source
VS Code Extension
Monitor every sat in real-time without leaving your editor.
- ⚡ Live payment feed per endpoint
- 📊 Bar chart — 1D / 7D (free) · 30D / 1Y / ALL (Pro)
- 🌍 11 languages built-in
- 🎨 Light / dark / auto theme
- 🔧 Zero config — just set your Lightning Address
Get a Lightning Address (free)
Sign up at dashboard.blink.sv — free, no credit card, instant.
Your address: [email protected]
Other wallets: Wallet of Satoshi · Phoenix · Zeus · Alby
Links
| Resource | URL |
|---|---|
| 📖 Docs (11 languages) | l402kit.com/docs |
| 📦 npm | npmjs.com/package/l402-kit |
| 🐍 PyPI | pypi.org/project/l402kit |
| 🦫 Go | pkg.go.dev/github.com/shinydapps/l402-kit/go |
| 🦀 Rust | crates.io/crates/l402kit |
| 🔌 VS Code | marketplace.visualstudio.com |
| ⚡ Lightning | [email protected] |
| 🐙 GitHub | github.com/ShinyDapps/l402-kit |
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.