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.
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