Protocol · Non-custodial

Get your API credentials in 30 seconds

Sign up, install the SDK, and configure your own public addresses in your codebase. We never see your keys.

Step 1 of 3 Shop
1
2
3

Tell us about your shop

Just two things — a display name and an email for receipts and incident alerts.

Used for payment receipts, webhook failure alerts and the merchant_id we send back. We never email marketing.

By continuing you agree to our Terms and Privacy.

Account ready

Your credentials — shown once

Copy these now. We store hashed versions and can't recover them later. Rotate any time from the dashboard.

public
mch_...
shown once
zk_live_••••••••••••••••••••
shown once
whsec_••••••••••••••••••••••••••••••
dotenv

            
Save these now — we won't show them again. Your public addresses (BTC/ETH/SOL) live in your code, not on our servers. We never see them until you call zp.register().

Install the SDK · configure in your code

Your public addresses stay in your environment variables. You call zp.register() at boot — our listener watches the chain and posts webhooks when payments confirm.

shell
npm install @zettapay/sdk
typescript
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://your-site.com/zp/webhook',
});

// Run once at boot — registers pubkeys with the chain listener.
await zp.register();
Your pubkeys, your control
Drop your Bitcoin, Ethereum and Solana receiving addresses into your environment variables. ZettaPay never stores or transmits them outside your zp.register() call — and you can rotate them any time by redeploying with a new env var.
P2P
Non-custodial
Protocol
SDK + webhooks
x402 + MCP
Agent-native
Copied to clipboard