Add Bitcoin Lightning pay-per-call to any API in 3 lines. L402 protocol for FastAPI and Flask. 0.3% fee, zero config.
Project description
l402kit
🇺🇸 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.
pip install l402kit
📖 Docs / Documentação / Documentation:
🇺🇸 English · 🇧🇷 Português · 🇪🇸 Español · 🇨🇳 中文 · 🇮🇳 हिंदी · 🇸🇦 العربية · 🇫🇷 Français · 🇩🇪 Deutsch · 🇷🇺 Русский · 🇯🇵 日本語 · 🇮🇹 Italiano
English
Add pay-per-call Bitcoin Lightning payments to any Python API. Works with FastAPI and Flask. No account. No bank. No chargebacks.
How it works
Client calls your API
→ Returns 402 + Lightning invoice
→ Client pays (< 1 second)
→ Client sends cryptographic proof
→ SHA256(preimage) == paymentHash ✓
→ API responds 200 + data
Money flow (managed mode):
Payment → ShinyDapps → 99.7% to your Lightning Address
→ 0.3% fee to ShinyDapps
FastAPI quickstart
from fastapi import FastAPI, Request
from l402kit import l402_required
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Try GET /premium"}
# Costs 100 sats (~$0.10) per call
@app.get("/premium")
@l402_required(
price_sats=100,
owner_lightning_address="you@blink.sv", # your Lightning Address — receives 99.7%
)
async def premium(request: Request):
return {"data": "Payment confirmed. Here is your data."}
Flask quickstart
from flask import Flask, jsonify
from l402kit import l402_required
app = Flask(__name__)
@app.get("/premium")
@l402_required(price_sats=100, owner_lightning_address="you@blink.sv")
def premium():
return jsonify({"data": "Payment confirmed."})
Test it
uvicorn main:app --reload
# First call — payment challenge
curl http://localhost:8000/premium
# → { "error": "Payment Required", "invoice": "lnbc1u...", "macaroon": "eyJ..." }
# Pay invoice with any Lightning wallet, then:
curl http://localhost:8000/premium \
-H "Authorization: L402 <macaroon>:<preimage>"
# → { "data": "Payment confirmed." }
Why not Stripe?
| Stripe | l402kit | |
|---|---|---|
| Minimum fee | $0.30 | < 1 sat (~$0.001) |
| Settlement | 2–7 days | < 1 second |
| Chargebacks | Yes | Impossible |
| Requires account | Yes | No |
| AI agent support | No | Yes — native |
| Countries blocked | ~50 | 0 — global |
Português
Adicione pagamentos por chamada via Bitcoin Lightning em qualquer API Python. Funciona com FastAPI e Flask. Sem conta. Sem banco. Sem chargeback.
FastAPI — início rápido
from fastapi import FastAPI, Request
from l402kit import l402_required
app = FastAPI()
@app.get("/premium")
@l402_required(
price_sats=100,
owner_lightning_address="você@blink.sv", # recebe 99.7% de cada pagamento
)
async def premium(request: Request):
return {"data": "Pagamento confirmado."}
Flask — início rápido
from flask import Flask, jsonify
from l402kit import l402_required
app = Flask(__name__)
@app.get("/premium")
@l402_required(price_sats=100, owner_lightning_address="você@blink.sv")
def premium():
return jsonify({"data": "Pagamento confirmado."})
Por que não Pix / Stripe?
| Stripe | Pix | l402kit | |
|---|---|---|---|
| Taxa mínima | R$1,50 | R$0,01 | < 1 sat |
| Liquidação | 2–7 dias | Instante | < 1 segundo |
| Chargeback | Sim | Não | Impossível |
| Funciona pra IA | Não | Não | Sim |
| Global | Não | Só Brasil | Sim — 0 fronteiras |
Español
Agrega pagos por llamada en Bitcoin Lightning a cualquier API Python.
from fastapi import FastAPI, Request
from l402kit import l402_required
app = FastAPI()
@app.get("/premium")
@l402_required(price_sats=100, owner_lightning_address="tu@blink.sv")
async def premium(request: Request):
return {"data": "Pago confirmado."}
Italiano
Aggiungi pagamenti pay-per-call in Bitcoin Lightning a qualsiasi API Python. Funziona con FastAPI e Flask.
FastAPI — avvio rapido
from fastapi import FastAPI, Request
from l402kit import l402_required
app = FastAPI()
@app.get("/premium")
@l402_required(
price_sats=100,
owner_lightning_address="tu@blink.sv", # riceve il 99.7% di ogni pagamento
)
async def premium(request: Request):
return {"data": "Pagamento confermato."}
Flask — avvio rapido
from flask import Flask, jsonify
from l402kit import l402_required
app = Flask(__name__)
@app.get("/premium")
@l402_required(price_sats=100, owner_lightning_address="tu@blink.sv")
def premium():
return jsonify({"data": "Pagamento confermato."})
Perché non Stripe?
| Stripe | l402kit | |
|---|---|---|
| Commissione minima | €0,25 | < 1 sat |
| Liquidazione | 2–7 giorni | < 1 secondo |
| Chargeback | Sì | Impossibile |
| Supporto agenti IA | No | Sì |
| Globale | No (~50 paesi bloccati) | Sì — 0 frontiere |
Advanced mode — bring your own Lightning wallet
import os
from fastapi import FastAPI, Request
from l402kit import l402_required, BlinkProvider
app = FastAPI()
lightning = BlinkProvider(
api_key=os.environ["BLINK_API_KEY"],
wallet_id=os.environ["BLINK_WALLET_ID"],
)
@app.get("/premium")
@l402_required(price_sats=100, lightning=lightning)
async def premium(request: Request):
return {"data": "Payment confirmed."}
Security
Every payment is cryptographically verified — impossible to fake:
SHA256(preimage) == paymentHash
- Anti-replay: each preimage works exactly once
- Expiry: tokens expire after 1 hour
- Open source: github.com/ShinyDapps/l402-kit
Get a free Lightning Address
Sign up at dashboard.blink.sv — free, no credit card.
Your address: yourname@blink.sv
Links
| Docs (11 languages) | shinydapps.mintlify.app |
| PyPI | pypi.org/project/l402kit |
| npm (TypeScript) | npmjs.com/package/l402-kit |
| GitHub | github.com/ShinyDapps/l402-kit |
| Creator | github.com/ThiagoDataEngineer |
| Lightning | shinydapps@blink.sv |
License
MIT — use freely, build freely. Bitcoin has no borders.
Built with ⚡ by ShinyDapps
Project details
Release history Release notifications | RSS feed
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 l402kit-0.9.0.tar.gz.
File metadata
- Download URL: l402kit-0.9.0.tar.gz
- Upload date:
- Size: 10.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46770d02968405d0ae779b30d1418d542cacd1f7233260a42a16647467515986
|
|
| MD5 |
8ad1340fd822c12a4ea2fea45429a442
|
|
| BLAKE2b-256 |
026f8fee3546d97d6d3a0d8657fc90f49fe64c834df0cbffea461f7bcaf6ae32
|
File details
Details for the file l402kit-0.9.0-py3-none-any.whl.
File metadata
- Download URL: l402kit-0.9.0-py3-none-any.whl
- Upload date:
- Size: 9.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
109043430d369138106f9f365b56bcaf6bfa92bdf3825887d831becbf59d09f7
|
|
| MD5 |
f6358a8ff3af74f1810e94f5763b7f5d
|
|
| BLAKE2b-256 |
dd89b802ede2c7bcc911250de4e463ebb46ad23a7221845029a8dd7c1a91a330
|