Block402 Block402 Docs

Overview

Block402 is a minimal layer for one-time unlocks using the x402 pattern. Gate any endpoint, file, or feature behind a verifiable payment—perfect for AI agents, APIs, dashboards, and premium tools.

No accounts or API keys. Your app receives payment proofs; access is issued as JWT.
Fast
~200ms on-chain verification
Simple
Decorator/middleware drop-in
Agent-Ready
Auto-payment client helpers

Installation

Python
pip install block402-core
pip install block402-client
pip install block402-fastapi
pip install block402-langchain
pip install block402-langgraph
Node.js / TypeScript
npm install @block402/core
npm install @block402/client
npm install @block402/express
npm install @block402/nextjs
npm install @block402/langchain
npm install @block402/langgraph

Quick Start

Server (FastAPI)
from fastapi import FastAPI
from block402_fastapi import payment_required

app = FastAPI()

@app.get("/premium-data")
@payment_required(
    amount="0.10",
    payment_address="YOUR_WALLET_ADDRESS",
    token_mint="USDC_MINT_ADDRESS"
)
async def get_premium_data():
    return {"data": "Hello, premium user!"}
Client (Auto-payment)
from block402_client import X402AutoClient
from solders.keypair import Keypair

client = X402AutoClient(wallet_keypair=Keypair())
resp = await client.fetch("https://api.example.com/premium-data")
print(resp.json())

REST API

Base URL (example): https://api.block402.app

POST /v1/checkout/create

Create a payment session.

{"productId":"prod_basic","userRef":"user_123"}
{"sessionId":"sess_abc123","expiresAt":"2025-12-01T00:00:00Z"}
POST /v1/checkout/confirm

Confirm payment and issue access token.

{"sessionId":"sess_abc123"}
{"accessToken":"jwt_here","expiresAt":"2026-01-01T00:00:00Z"}
GET /v1/access/:token

Check token status.

{"valid":true,"productId":"prod_basic","expiresAt":"2026-01-01T00:00:00Z"}

JS SDK

Include
<script src="/sdk/block402.js"></script>
<script>
  block402.init({ apiKey: "YOUR_PUBLIC_KEY" })
</script>
init(options)
block402.init({ apiKey:"KEY" })
unlock(productId)
await block402.unlock("prod_basic")
checkAccess(token)
const ok = await block402.checkAccess(jwt)

Middleware

Express (Node)
import express from "express";
import { paymentRequired } from "@block402/express";

const app = express();
app.get("/premium-data",
  paymentRequired({ amount:"0.10", tokenMint:"USDC_MINT_ADDRESS" }),
  (req,res)=> res.json({ data:"premium" })
);
app.listen(3000);
FastAPI (Python)
from fastapi import FastAPI
from block402_fastapi import payment_required

app = FastAPI()

@app.get("/report")
@payment_required(amount="0.25", token_mint="USDC_MINT_ADDRESS")
async def report():
    return {"ok": True}

Webhooks

Receive events at your endpoint (e.g., POST https://example.com/webhooks/block402).

payment.succeeded
{"event":"payment.succeeded","sessionId":"sess_1","tx":"...","amount":"0.10"}
access.issued
{"event":"access.issued","userRef":"user_123","productId":"prod_basic","jwt":"..."}
access.expired
{"event":"access.expired","jwt":"...","expiredAt":"..."}

Examples

Protect a file download (Express)
app.get("/download",
  paymentRequired({ amount:"1.00", tokenMint:"USDC" }),
  (req, res) => res.download("./files/report.pdf")
);
Agent auto-payment (Python)
from block402_client import X402AutoClient
client = X402AutoClient()
data = await client.fetch("https://api.example.com/alpha-feed").json()

FAQ

Do I need an account?

No. Block402 is stateless for integrators—just verify payments and issue JWT on your backend.

Which chains?

Solana first; the protocol is chain-agnostic and can be extended.

How do I show a pay modal?

Use block402.unlock(productId) from the JS SDK. It returns when payment is confirmed.

Open Source • Built for Solana — Block402

Back to top ↑