Client Integration
Make T402 payments from your application.
TypeScript (Fetch)
The easiest way to integrate T402 is with the fetch wrapper:
import { t402Client, wrapFetchWithPayment } from '@t402/fetch'
import { registerExactEvmScheme } from '@t402/evm/exact/client'
import { privateKeyToAccount } from 'viem/accounts'
// 1. Create client
const client = new t402Client()
// 2. Register payment schemes
registerExactEvmScheme(client, {
signer: privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
})
// 3. Wrap fetch
const fetchWithPayment = wrapFetchWithPayment(fetch, client)
// 4. Make requests - payments handled automatically!
const response = await fetchWithPayment('https://api.example.com/premium')
const data = await response.json()Multi-Network Client
Support multiple blockchain networks:
import { t402Client, wrapFetchWithPayment } from '@t402/fetch'
import { registerExactEvmScheme } from '@t402/evm/exact/client'
import { registerExactTonClientScheme } from '@t402/ton'
import { registerExactTronClientScheme } from '@t402/tron'
const client = new t402Client()
// Register EVM (Ethereum, Base, Arbitrum, etc.)
registerExactEvmScheme(client, {
signer: evmSigner
})
// Register TON
registerExactTonClientScheme(client, {
signer: tonSigner,
getJettonWalletAddress: async (owner, master) => {
// Return the Jetton wallet address
return jettonWalletAddress
}
})
// Register TRON
registerExactTronClientScheme(client, {
signer: tronSigner
})
// Now the client can pay on any supported network
const fetchWithPayment = wrapFetchWithPayment(fetch, client)Axios Integration
import axios from 'axios'
import { t402AxiosInterceptor } from '@t402/axios'
import { registerExactEvmScheme } from '@t402/evm/exact/client'
const client = new t402Client()
registerExactEvmScheme(client, { signer })
// Add interceptor to axios instance
const api = axios.create({ baseURL: 'https://api.example.com' })
t402AxiosInterceptor(api, client)
// Make requests
const response = await api.get('/premium')With Tether WDK
Use Tether WDK for wallet management:
import { WDK } from '@tetherto/wdk'
import { createWdkSigner } from '@t402/wdk'
// Initialize WDK
const wdk = new WDK({ /* config */ })
const account = await wdk.createAccount()
// Create signer from WDK account
const signer = createWdkSigner(account)
// Use with T402 client
const client = new t402Client()
registerExactEvmScheme(client, { signer })Python Client
import httpx
from t402.client import T402Client
from t402.evm import create_evm_signer
# Create client
client = T402Client()
# Register EVM signer
signer = create_evm_signer(private_key="0x...")
client.register("eip155:8453", signer)
# Make request
async with httpx.AsyncClient() as http:
response = await client.fetch(
http,
"https://api.example.com/premium"
)
data = response.json()Go Client
package main
import (
"fmt"
t402 "github.com/t402-io/t402/go"
"github.com/t402-io/t402/go/mechanisms/evm/exact/client"
)
func main() {
// Create client
c := t402.NewClient()
// Register EVM scheme
evmScheme := client.NewExactEvmScheme(privateKey)
c.Register("eip155:8453", evmScheme)
// Make request
resp, err := c.Fetch("https://api.example.com/premium")
if err != nil {
panic(err)
}
fmt.Println(resp.Body)
}Payment Preferences
Configure network preferences:
const client = new t402Client({
// Prefer these networks (in order)
preferredNetworks: ['eip155:8453', 'eip155:42161', 'eip155:1'],
// Maximum amount willing to pay
maxAmount: '10000000', // 10 USDT
// Callback on payment
onPayment: (payment) => {
console.log(`Paid ${payment.amount} on ${payment.network}`)
}
})Error Handling
import { T402Error, PaymentRequiredError, PaymentFailedError } from '@t402/core'
try {
const response = await fetchWithPayment('https://api.example.com/premium')
} catch (error) {
if (error instanceof PaymentRequiredError) {
console.log('Payment required:', error.requirements)
} else if (error instanceof PaymentFailedError) {
console.log('Payment failed:', error.reason)
} else if (error instanceof T402Error) {
console.log('T402 error:', error.message)
}
}Balance Checking
Check balances before making requests:
import { getBalance } from '@t402/evm'
// Check USDT0 balance on Base
const balance = await getBalance({
address: '0x...',
network: 'eip155:8453',
token: 'USDT0'
})
console.log(`Balance: ${balance.formatted} USDT0`)