P2P protocol. Install in 30 seconds. Your pubkey stays in your code — we just watch the chain and ping your webhook the moment a payment confirms. Bitcoin · Ethereum · USDC on Solana. x402 + MCP native — built for AI agents.
The hard problem in crypto checkout isn’t taking the payment — it’s knowing it landed. ZettaPay listens to the chain and resolves “did they pay?” without ever holding a single satoshi.
The customer sends the on-chain transaction straight from their wallet to your merchant address — Bitcoin, Ethereum, or USDC on Solana. ZettaPay never touches the funds. The chain itself is the settlement layer.
Our chain listener follows every relevant block and confirms the deposit on the network you chose: <2s on Solana, finality on Ethereum L2s, ~10 minutes on Bitcoin. No middleman, no custodial holding pattern — just verified on-chain truth.
Your endpoint receives a signed webhook with verified amount, currency, chain, and tx hash. Retries, idempotency keys, HMAC signatures — everything your backend already expects from a payment processor.
Whether your customer is human, autonomous, or programmatic — ZettaPay confirms it the same way.
Claude, GPT, Gemini. Pay autonomously via signed transactions in HTTP headers. No keys to custody.
# x402 header with signed Solana tx
POST /pay
x-402-payment: "<signed-tx-blob>"
{
"merchant": "@coffee-bot",
"amount_usdc": 2.50
}
Scan a QR or paste an address — no wallet connect, no extension required. Pay from any wallet you already use, on Solana, Bitcoin, or Ethereum. No crypto knowledge required.
// Wallet-less checkout: QR + address
const { checkoutUrl } = await zettapay.invoices.create({
merchant: "@store",
amount: 42.00,
currency: "USDC"
});
Install the SDK. Your pubkey lives in your env vars — never on our servers. No wallet connect, no custody, no protocol fee. Three lines to accept payments on three chains.
import { ZettaPay } from '@zettapay/sdk';
const zp = new ZettaPay({
apiKey: process.env.ZETTAPAY_API_KEY,
pubkeys: { sol: process.env.MERCHANT_SOL_PUBKEY },
});
await zp.register();
Real Solana devnet transaction. Real USDC airdrop. Real settlement <2s.
Six properties that legacy rails can’t match because they fundamentally can’t be non-custodial peer-to-peer infrastructure.
ZettaPay never touches the money. Funds move directly payer→merchant on-chain, peer-to-peer. We can’t freeze, claw back, or lose your USDC because we never had it. Not a money-services business.
Accept Bitcoin, Ethereum (Base + Polygon), and USDC on Solana through a single API. <2s on Solana, finality on EVM L2s, ~10 minutes on Bitcoin. Your code stays the same.
The differentiator: ZettaPay tracks every relevant block and resolves “did the customer actually pay?” for you. Conceptually the same primitive as a Stripe webhook — but peer-to-peer, on-chain, verifiable.
Your pubkey lives in your code, in env vars you control. No wallet connect, no extension, no browser modal. Rotate keys without logging into our site; multi-environment (dev / staging / prod) is just different env files.
Built for the agent economy. AI agents pay autonomously via the x402 header spec, and ZettaPay confirms the on-chain receipt automatically through a first-class MCP server. No middleman, no custodied wallet.
Protocol spec and SDKs are MIT-licensed on GitHub. Read the listener code, audit the webhook signing, run a fork. No lock-in, no proprietary rails — just open infrastructure.
No subscription. No per-transaction take. You pay only network gas — the same amount any wallet transaction would cost. Zero protocol fee because we are infrastructure, not a middleman.
ZettaPay is the first payment protocol with native x402 protocol and Model Context Protocol support. AI agents discover, pay, and settle autonomously — no human in the loop.
pay, verify, refund.// x402 Payment Header — agent pays autonomously const response = await fetch("https://api.merchant.com/buy", { method: "POST", headers: { "x-402-payment": signedSolanaTx, "x-402-amount": "2.50", "x-402-currency": "USDC", }, body: JSON.stringify({ item: "cappuccino", merchant: "@cafe-bot" }) }); // -> 200 OK, settled in 1.4s on Solana
// MCP Tool Definition for Claude/GPT { "name": "pay_with_zettapay", "description": "Send USDC payment on Solana", "input_schema": { "type": "object", "properties": { "merchant": { "type": "string" }, "amount_usdc": { "type": "number" }, "memo": { "type": "string" } } } }
Install the SDK, configure your wallet addresses in env vars, register once. We watch the chain from there.
$ npm install @zettapay/sdk
# .env — stays on your servers, never on ours
ZETTAPAY_API_KEY=sk_live_...
ZETTAPAY_WEBHOOK_SECRET=whsec_...
MERCHANT_BTC_PUBKEY=bc1q...
MERCHANT_ETH_PUBKEY=0x...
MERCHANT_SOL_PUBKEY=7Np41o...
import { ZettaPay } from '@zettapay/sdk';
const zp = new ZettaPay({
apiKey: process.env.ZETTAPAY_API_KEY,
webhookSecret: process.env.ZETTAPAY_WEBHOOK_SECRET,
pubkeys: {
btc: process.env.MERCHANT_BTC_PUBKEY,
eth: process.env.MERCHANT_ETH_PUBKEY,
sol: process.env.MERCHANT_SOL_PUBKEY,
},
webhookUrl: 'https://my-app.com/zp/webhook',
});
await zp.register(); // registers your pubkeys with the ZettaPay chain listener
// Done. ZettaPay watches BTC / ETH / SOL for incoming deposits to your addresses
// and posts a signed webhook to webhookUrl the moment a transaction confirms.
Open protocol. Non-custodial. Multi-chain. AI-native. Your pubkey stays in your code.