Crypto payments that
confirm themselves

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.

0
Protocol fee
<2s
Solana confirm
3
Chains supported
0
Custody, ever
Solana·USDC·Bitcoin·Ethereum·x402 protocol·Model Context Protocol·Wallet-less·Anchor framework·TypeScript SDK· Solana·USDC·Bitcoin·Ethereum·x402 protocol·Model Context Protocol·Wallet-less·Anchor framework·TypeScript SDK·
How confirmation works

Peer-to-peer payments. Verified for you.

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.

01
Customer pays

Direct to your pubkey

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.

02
Listener tracks

We watch the chain 24/7

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.

03
Webhook fires

Stripe-grade events

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.

Who pays

One protocol, three kinds of payers

Whether your customer is human, autonomous, or programmatic — ZettaPay confirms it the same way.

AI Agents

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
}

Humans

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"
});

Merchants

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();
Live demo

See a payment happen

Real Solana devnet transaction. Real USDC airdrop. Real settlement <2s.

Demo merchant
@hackathon-demo
Amount 10.00 USDC
Protocol fee 0 USDC
Network Solana Devnet
Network gas (payer) ~0.000005 SOL
Confirmed in ~1.4s
$ awaiting demo...
Click "Pay" to execute on Solana devnet
What you get

A protocol, not a processor

Six properties that legacy rails can’t match because they fundamentally can’t be non-custodial peer-to-peer infrastructure.

Non-custodial by design

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.

Multi-chain, one webhook

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.

Auto-confirmation listener

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.

Wallet-less, dev-native

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.

x402 + MCP native

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.

Open protocol, verifiable

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.

Pricing

Free protocol.

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.

$0
Protocol fee, forever
For AI Agents

Your agent buys while you sleep

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.

01
x402 HTTP Payment Protocol
Open spec for machine-to-machine payments. Sign once, pay anywhere.
02
MCP Tool Definitions
Drop into Claude/GPT instantly. pay, verify, refund.
03
Idempotency & Replay Safety
Agents retry. We dedupe. No double-spend. Cryptographic finality.
x402-payment.ts
// 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-tools.json
// 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" }
    }
  }
}
How install works

Three steps. Pubkey in your code.

Install the SDK, configure your wallet addresses in env vars, register once. We watch the chain from there.

1. Install the SDK
$ npm install @zettapay/sdk
2. Your wallet addresses live in your env vars
# .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...
3. Initialize & register — six lines, copy-paste ready
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.

Install in 30 seconds.
We’ll watch the chain.

Open protocol. Non-custodial. Multi-chain. AI-native. Your pubkey stays in your code.