On-chain ledger
ERC-20 deposits, payer balances, settlement batches, withdrawals, and subscriptions are accounted for on the Channel ledger contract.
ChannelLedger.solPrice API routes in compute units, return a standards-aligned 402 quote, and accept wallet-signed EIP-712 payment proofs on retry. Channel keeps balances non-custodial while settling supported ERC-20 tokens such as USDC and USDT.
Meter requests, authorize spend with wallet signatures, and settle supported ERC-20 tokens without custodial API balances.
Agents buy compute, data, and services autonomously — machine-to-machine commerce inside signed spend limits, no human approval per transaction.
ExplorePay-per-call access to any HTTP API, billed by compute units — per-inference, per-query, per-request, with no processor minimums.
ExploreSelf-custodial acceptance for checkout, POS, links, and invoices — zero fee in-app, no chargebacks, settle on-chain anytime.
ExploreScan-to-pay checkout, P2P transfers, remittances, tips, and gig payouts — settled in seconds at near-zero cost.
ExploreTurn any screen into a register — scan a counter QR, confirm, and pay for a coffee or burger in seconds. No terminal, non-custodial, settles to the merchant wallet.
ExploreSaaS billing, gated content, DAO dues, memberships, installments, and per-second streaming payments — on-chain, non-custodial.
ExploreA rail other apps build on — white-label checkout, marketplace split settlement, and treasury automation via the SDK.
ExploreChannel is an HTTP 402 payment protocol, not a custodial processor. User balances remain on-chain in supported ERC-20 tokens, while each API call is authorized by an EIP-712 proof and reconciled through the on-chain ledger.
ERC-20 deposits, payer balances, settlement batches, withdrawals, and subscriptions are accounted for on the Channel ledger contract.
ChannelLedger.solPublish endpoint pricing at /.well-known/payment-manifest.json, including token address, unit price, base fee, and ledger contract.
Quote fees from compute units and token decimals, enabling deterministic micro-pricing without minimum card charges.
Compute unitsUse the same ledger primitives for peer transfers, QR invoices, subscription renewals, and gated API access.
Peer + plansTyped-data payment proofs, HTTP 402 negotiation, nonce-based replay protection, and ledger settlement for supported ERC-20 tokens.
EIP-712 typed structured dataECDSA on curve secp256k1LedgerPayment — off-chain spend authorization for a single paid requestLedgerAuth — validator co-signed settlement, withdrawal, and subscription authorizationname = SaaS host · version = 1 · chainId · verifyingContractChannelLedger v1 · batch settle · subscription renewaltimestamp_ms × 10⁶ + random · replay protection per payerPAYMENT_REQUIRED · compute units · token · estimatedFee · nonce contextX-Payment-Auth — base64 JSON { proof, sig, domain } carrying typed-data authorizationX-Channel-Payer · X-Channel-Max-Amount · X-Channel-Client-SourcefeeMicro in token micro-unitsChannelLedger.sol — balances · settle · withdraw · subscriptionsChannelDepositProxy · deterministic per payersupportedTokens registry · token decimals · USDC · USDT · extensible30s · pending signature batch to chainstruct LedgerPayment {
address payer;
address payee;
address proxyAddress;
address token;
uint256 amount;
uint256 nonce;
uint64 expiry;
}
struct LedgerAuth {
address payer;
address payee;
address token;
uint256 amount;
uint256 nonce;
uint64 expiry;
}
Agents can call paid APIs thousands of times per session while Channel enforces per-request pricing, max-spend limits, and wallet-signed EIP-712 proofs.
ChannelCash wallet client for LangChain, CrewAI, backend workers, and custom runtimes
Private keys remain in wallet context; agents submit signed payment proofs, not API secrets
Set max amounts per inference, tool call, query, or data request in supported tokens
Escalate high-value or interactive approvals to browser extension or mobile wallet flows
const pay = withChannel(client);
const { data, fee } = await pay(
"/api/v1/greeting",
{},
{ maxAmount: "0.01" }
);
ChannelCash SDK init
GET /api/v1/greeting
PAYMENT_REQUIRED
estimatedFee · computeUnits
Sign LedgerPayment
EIP-712 · X-Payment-Auth
Verify & deliver
token settled · response JSON
Channel never takes custody of user funds. Wallets hold the signing keys, balances remain on-chain, and payment authorizations are produced locally by extension, mobile, or headless clients.
Connect sites, inspect spend requests, sign EIP-712 payloads, and approve peer transfers directly in the browser.
PIN and biometrics, QR receive requests, account profiles, and remote approvals from your phone.
HD-derived accounts from one recovery phrase, with @username profiles and per-account activity.
Waiting for $5.00
@alice · Channel
Payment received
+$5.00 USDT
Credited to @alice
"Signing happens at the edge. Settlement remains verifiable on-chain."
The SDK discovers pricing from the payment manifest or a 402 quote, asks the wallet to sign a typed LedgerPayment, retries with X-Payment-Auth, and lets the provider verify before serving the paid response.
0.001 USDC → 0x4f3a…9c2
X-Payment-Auth: 0x9b2f…a7c1
{ "greeting": "Hello, agent", "paid": "0.001 USDC", "tx": "0x9b2f…a7c1" }
EIP-712 signature ✓
debit 0.001 USDC · tx 0x7e…
GET /api/v1/greeting
200 OK · application/json
Providers: wrap routes with monetize() middleware · Merchants: reconcile signed requests, ledger balances, and supported tokens
Typed SDKs for Node.js and browsers, HTTP 402 middleware, wallet providers, payment manifests, and Solidity contracts in one integration stack.
// Gate an Express route with HTTP 402
import { setupChannel } from "@channel-sdk/nodejs";
const { monetize } = setupChannel(app, endpoints, { merchantWallet });
app.get("/api/v1/greeting",
monetize(5),
(req, res) => res.json({
message: "Hello",
fee: req.payment!.fee
})
);
// AI agent or backend — self-custodial wallet
import { ChannelClient, withChannel } from "@channel-sdk/nodejs";
const client = new ChannelClient({
baseUrl: process.env.DEMO_SAAS_URL,
mnemonic: process.env.CHANNEL_MNEMONIC,
clientSource: "ChannelCash",
});
const pay = withChannel(client);
const { data, fee } = await pay(
"/api/v1/greeting",
{},
{ maxAmount: "0.01" }
);
console.log(data, fee);
// Browser — extension signs, wallet holds keys
import {
ChannelBrowserClient,
ExtensionWalletProvider,
withChannelBrowser,
} from "@channel-sdk/browser";
const wallet = new ExtensionWalletProvider();
const client = new ChannelBrowserClient({
baseUrl: import.meta.env.VITE_DEMO_SAAS_URL,
wallet,
});
const pay = withChannelBrowser(client);
await wallet.connect({ origin: window.location.origin });
const { data, fee } = await pay(
"/api/v1/greeting",
{},
{ maxAmount: "0.01" }
);
@channel-sdk/nodejs
available
Express middleware, 402 negotiation, headless agents, ChannelCash wallet client
@channel-sdk/browser
available
Extension and mobile wallet providers for connection, EIP-712 signing, and approvals
react-demo
available
Browser demo for wallet connection, paid requests, and approval flows
ChannelLedger.sol
available
Multi-token ledger · EIP-712 domains · validator co-sign
expo-wallet
available
React Native wallet · HD accounts · PIN · biometrics · QR approvals
@channel-sdk/python
soon
Agent frameworks · LangChain tool payments · spend policies
Channel isn't live yet — follow along for protocol updates, early access, and launch news on Telegram and X.