t402 is an open standard for internet native payments. It aims to support all networks (both crypto & fiat) and forms of value (stablecoins, tokens, fiat).
app.use(
paymentMiddleware(
{
"GET /weather": {
accepts: [...], // As many networks / schemes as you want to support
description: "Weather data", // what your endpoint does
},
},
),
);
// That's it! See examples/ for full details@t402/core Core types, client, server, facilitator abstractions
@t402/extensions Bazaar, Sign-In-With-X extensions
Mechanisms (Chain-specific payment implementations):
@t402/evm EIP-3009, ERC-4337, USDT0 bridge for EVM chains (19 networks)
@t402/evm-core Shared EVM utilities
@t402/svm Solana SPL token support
@t402/ton TON Jetton (TEP-74) support
@t402/tron TRON TRC-20 support
@t402/near NEAR NEP-141 token support
@t402/aptos Aptos Fungible Asset support
@t402/tezos Tezos FA2 token support
@t402/polkadot Polkadot Asset Hub support
@t402/stacks Stacks (Bitcoin L2) SIP-010 support
@t402/cosmos Cosmos (Noble) native USDT support
HTTP Integrations:
@t402/express Express.js middleware
@t402/hono Hono middleware
@t402/fastify Fastify middleware
@t402/next Next.js integration
@t402/fetch Fetch API wrapper
@t402/axios Axios interceptor
@t402/paywall Payment wall UI components
@t402/react React hooks and components
@t402/vue Vue composables and components
WDK (Wallet Development Kit):
@t402/wdk Tether WDK integration
@t402/wdk-gasless ERC-4337 gasless payments
@t402/wdk-bridge LayerZero cross-chain bridging
@t402/wdk-multisig Safe multi-sig support
Transports:
@t402/a2a Agent-to-Agent transport
Tools:
@t402/mcp AI Agent MCP server (Claude, etc.)
@t402/cli Command-line tools
Installation
# Core packages
pnpm add @t402/core @t402/evm
# With specific framework
pnpm add @t402/express # Express.js
pnpm add @t402/next # Next.js
pnpm add @t402/hono # Hono
# Gasless payments
pnpm add @t402/wdk-gasless
# MCP Server for AI Agents
pnpm add @t402/mcp
npx @t402/mcp # Run directly
# CLI tool
pnpm add -g @t402/cli
t402 --helppip install t402
# Or with uv
uv add t402
# CLI tool included
t402 --helpgo get github.com/t402-io/t402/sdks/go@v1.9.0
# CLI tool
go install github.com/t402-io/t402/sdks/go/cmd/t402@v1.9.0
t402 --help<dependency>
<groupId>io.t402</groupId>
<artifactId>t402</artifactId>
<version>1.10.0</version>
</dependency>Or with Gradle:
implementation 'io.t402:t402:1.10.0'Supported Networks
- Ethereum (
eip155:1), Arbitrum (eip155:42161), Optimism (eip155:10) - Base (
eip155:8453), Polygon (eip155:137), Ink (eip155:57073) - Berachain (
eip155:80094), Unichain (eip155:130), Mantle (eip155:5000) - Sei (
eip155:1329), Conflux (eip155:1030), Monad (eip155:143) - Flare (
eip155:14), Rootstock (eip155:30), XLayer (eip155:196) - Plasma (
eip155:9745), HyperEVM (eip155:999), MegaETH (eip155:4326) - Corn (
eip155:21000000) - Legacy USDT: BNB Chain, Avalanche, Fantom, Celo, Kaia
- Gasless Transactions: Users pay zero gas fees via paymaster sponsorship
- Smart Accounts: Safe 4337 Module v0.3.0 integration
- Bundlers: Pimlico, Alchemy, and generic bundler support
- Paymasters: Pimlico, Biconomy, Stackup integrations
- EntryPoint v0.7: Full support for latest ERC-4337 specification
- Solana Mainnet (
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp) - Solana Devnet (
solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1) - Supports USDC and native SOL
- TON Mainnet (
ton:mainnet) - TON Testnet (
ton:testnet) - Supports USDT Jetton (TEP-74 standard)
- TRON Mainnet (
tron:mainnet) - TRON Nile Testnet (
tron:nile) - TRON Shasta Testnet (
tron:shasta) - Supports USDT TRC-20 (TIP-20 standard)
- NEAR Mainnet (
near:mainnet) - NEAR Testnet (
near:testnet) - Supports USDT NEP-141 token
- Aptos Mainnet (
aptos:1) - Aptos Testnet (
aptos:2) - Supports USDT Fungible Asset
- Tezos Mainnet (
tezos:NetXdQprcVkpaWU) - Tezos Ghostnet (
tezos:NetXnHfVqm9iesp) - Supports USDt FA2 token
- Polkadot Asset Hub (
polkadot:68d56f15f85d3136970ec16946040bc1) - Westend Asset Hub (testnet)
- Supports USDT (Asset ID: 1984)
- Stacks Mainnet (
stacks:1) - Stacks Testnet (
stacks:2147483648) - Supports sBTC and SIP-010 tokens
- Noble Mainnet (
cosmos:noble-1) - Noble Testnet (
cosmos:grand-1) - Supports native USDC via MsgSend
- All 19 USDT0 networks fully supported
- Message tracking via LayerZero Scan API
All SDKs include CLI tools for payment operations.
# Verify a payment payload
t402 verify <base64-payload>
# Settle a payment
t402 settle <base64-payload>
# List supported networks
t402 supported
# Encode/decode payloads
t402 encode payment.json
t402 decode <base64-string>
# Network information
t402 info eip155:8453Available in: TypeScript (@t402/cli), Python (pip install t402), Go (go install .../cmd/t402)
- Open standard: the t402 protocol will never force reliance on a single party
- HTTP Native: t402 is meant to seamlessly complement the existing HTTP request made by traditional web services
- Chain and token agnostic: we welcome contributions that add support for new chains, signing standards, or schemes
- Trust minimizing: all payment schemes must not allow for the facilitator or resource server to move funds, other than in accordance with client intentions
- Easy to use: t402 needs to be 10x better than existing ways to pay on the internet
| Feature | TypeScript | Go | Python | Java |
|---|---|---|---|---|
| Core Client | âś… | âś… | âś… | âś… |
| Core Server | âś… | âś… | âś… | âś… |
| Facilitator | âś… | âś… | âś… | âś… |
| EVM (19 USDT0 networks) | âś… | âś… | âś… | âś… |
| SVM (Solana) | âś… | âś… | âś… | âś… |
| TON | âś… | âś… | âś… | âś… |
| TRON | âś… | âś… | âś… | âś… |
| NEAR | âś… | âś… | âś… | âś… |
| Aptos | âś… | âś… | âś… | âś… |
| Tezos | âś… | âś… | âś… | âś… |
| Polkadot | âś… | âś… | âś… | âś… |
| Stacks | âś… | âś… | âś… | âś… |
| Cosmos | âś… | âś… | âś… | âś… |
| ERC-4337 Gasless | âś… | âś… | âś… | âś… |
| USDT0 Bridge | âś… | âś… | âś… | âś… |
| WDK Integration | âś… | âś… | âś… | âś… |
| MCP Server | âś… | âś… | âś… | âś… |
| CLI Tool | âś… | âś… | âś… | âś… |
Legend: ✅ Complete | ❌ Not Available
Total Supported Networks: 44+ across 10 blockchain families
| SDK | Version | Release Date | Changelog |
|---|---|---|---|
| TypeScript | v2.4.0 | 2026-02-06 | CHANGELOG |
| Python | v1.10.1 | 2026-02-06 | CHANGELOG |
| Go | v1.9.0 | 2026-02-06 | CHANGELOG |
| Java | v1.10.0 | 2026-02-06 | CHANGELOG |
The t402 ecosystem is growing! Check out our ecosystem page to see projects building with t402.
- Whitepaper: T402 Protocol Whitepaper (PDF)
- Roadmap: ROADMAP.md
- Documentation: docs.t402.io
resource: Something on the internet (webpage, API, RPC service, etc.)client: An entity wanting to pay for a resourcefacilitator: A server that facilitates verification and execution of paymentsresource server: An HTTP server that provides an API or resource for a client
sequenceDiagram
participant Client
participant Server as Resource Server
participant Facilitator
participant Blockchain
Client->>Server: GET /api
Server->>Client: 402 Payment Required
Note over Client: Create payment payload
Client->>Server: GET /api + PAYMENT-SIGNATURE header
Server->>Facilitator: POST /verify
Facilitator->>Server: Verification result
Note over Server: Process request
Server->>Facilitator: POST /settle
Facilitator->>Blockchain: Submit transaction
Blockchain->>Facilitator: Confirmed
Facilitator->>Server: Settlement result
Server->>Client: 200 OK + Content
Clientmakes an HTTP request to aresource serverResource serverresponds with402 Payment RequiredandPAYMENT-REQUIREDheaderClientcreates aPaymentPayloadbased on selectedscheme&networkClientsends request withPAYMENT-SIGNATUREheaderResource serververifies via facilitator's/verifyendpointFacilitatorvalidates and returns verification response- If valid, server fulfills request and settles payment via
/settle Resource serverreturns200 OKwithPAYMENT-RESPONSEheader
TypeScript Client
import { t402Client, wrapFetchWithPayment } from "@t402/fetch";
import { registerExactEvmScheme } from "@t402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new t402Client();
registerExactEvmScheme(client, {
signer: privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`),
});
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
const response = await fetchWithPayment("https://api.example.com/data");TypeScript Server (Express)
import express from "express";
import { paymentMiddleware, t402ResourceServer } from "@t402/express";
import { ExactEvmScheme } from "@t402/evm/exact/server";
const app = express();
app.use(
paymentMiddleware(
{
"GET /api/data": {
accepts: [
{ scheme: "exact", price: "$0.01", network: "eip155:8453", payTo: "0x..." },
],
description: "Premium API data",
},
},
new t402ResourceServer(facilitatorClient)
.register("eip155:8453", new ExactEvmScheme()),
),
);Python Server (Flask)
from flask import Flask
from t402.flask import create_paywall
app = Flask(__name__)
paywall = create_paywall(
routes={
"GET /api/data": {
"price": "$0.01",
"network": "eip155:8453",
"pay_to": "0x...",
"description": "Premium API data",
},
},
facilitator_url="https://facilitator.t402.io",
)
app.register_blueprint(paywall)
@app.route("/api/data")
def get_data():
return {"data": "premium content"}Go Server
package main
import (
"net/http"
t402 "github.com/t402-io/t402/sdks/go"
t402http "github.com/t402-io/t402/sdks/go/http"
)
func main() {
server := t402.NewResourceServer(facilitatorClient)
mux := http.NewServeMux()
mux.Handle("/api/data", t402http.PaymentMiddleware(
server,
t402http.RouteConfig{
Path: "GET /api/data",
Accepts: []t402.PaymentRequirement{
{Scheme: "exact", Price: "$0.01", Network: "eip155:8453", PayTo: "0x..."},
},
},
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{"data": "premium content"}`))
}),
))
http.ListenAndServe(":8080", mux)
}ERC-4337 Gasless Payments
import { SafeSmartAccount, createBundlerClient, createPaymaster } from "@t402/evm/erc4337";
// Create Safe smart account
const safeAccount = new SafeSmartAccount({
owner: privateKeyToAccount(ownerPrivateKey),
chainId: 8453,
});
// Connect bundler and paymaster
const bundler = createBundlerClient({ provider: "pimlico", apiKey, chainId: 8453 });
const paymaster = createPaymaster({ provider: "pimlico", apiKey, chainId: 8453 });
// Build, sponsor, and submit UserOperation
const callData = safeAccount.encodeExecute(targetAddress, 0n, data);
const userOp = await bundler.buildUserOperation({ sender: smartAccountAddress, callData });
const paymasterData = await paymaster.sponsorUserOperation(userOp);
const hash = await bundler.sendUserOperation({ ...userOp, ...paymasterData, signature });MCP Server for AI Agents
# Install and run
npx @t402/mcp
# Claude Desktop config (~/.config/claude/claude_desktop_config.json)
{
"mcpServers": {
"t402": {
"command": "npx",
"args": ["@t402/mcp"],
"env": { "T402_DEMO_MODE": "true" }
}
}
}Available Tools:
t402/getBalance- Check wallet balancet402/getAllBalances- Check all chain balancest402/pay- Execute paymentt402/payGasless- Gasless payment via ERC-4337t402/getBridgeFee- Get bridge fee quotet402/bridge- Bridge USDT0 between chains
USDT0 Cross-Chain Bridge
import { Usdt0Bridge, LayerZeroScanClient } from "@t402/evm";
const bridge = new Usdt0Bridge(signer, "arbitrum");
// Get quote
const quote = await bridge.quote({
fromChain: "arbitrum",
toChain: "ethereum",
amount: 100_000000n,
recipient: "0x...",
});
// Execute bridge
const result = await bridge.send({ ...quote });
// Track delivery
const scanClient = new LayerZeroScanClient();
await scanClient.waitForDelivery(result.messageGuid);See specs/ for full documentation of the t402 standard.
A scheme is a logical way of moving money. Different schemes support different payment flows:
exact- Transfer a specific amount (e.g., pay $1 to read an article)upto- Transfer up to an amount based on usage (e.g., LLM token generation)
See specs/schemes/ for detailed scheme specifications.
See CONTRIBUTING.md for development setup and guidelines.
See SECURITY.md for security policy and vulnerability reporting.
Apache 2.0 - See LICENSE for details.