Plug & play install · under 5 minutes

From zero to first confirmed payment

Pick your stack, paste your payout addresses, copy three files. No account required. Your keys stay on your server — we just watch the chain and ping your webhook.

100% open-source Non-custodial Audit in progress Install with AI instead → View source on GitHub →
1 Stack
2 Chains
3 Code
4 Verify

Where will you integrate?

We’ll generate code that’s drop-in for your stack. You can change this later.

Open source

Which chains will you accept?

Paste the payout address for each chain. These stay in your .env — we never see your keys.

Stays in your code
How this works. Customers send to your address from any wallet they own. We watch the chain, verify the on-chain transfer, and POST a signed webhook to your server. ZettaPay never holds funds. Read the wallet-less spec →

Copy these 3 files

Drop them into your repo. Pubkeys are already filled in. Every line has a comment so you can read it before you trust it.

Self-hosted secrets
// We never custody. Funds flow directly to YOUR address.
1 · Install the SDK

              
            
2 · Drop these files in your repo

            
          
View these templates on GitHub →

Verify the install

Five checks. None require an account. None send your keys anywhere.

Signed Ed25519
CLI · coming soon
# single command runs all 5 checks against your local server
npx @zettapay/cli verify
Beta · PR pending
Manual checklist · works today
1
SDK installed
Run npm ls @zettapay/sdk (or your package manager equivalent) and confirm a version appears.
2
Env vars are set
In your dev shell: echo $ZETTAPAY_WEBHOOK_SECRET should print a hex string. If empty, restart your dev server after editing .env.
3
Pubkeys reach the chain listener
Curl our public listener:
curl https://zettapay.vercel.app/api/status
Status should return ok with the chains you selected listed under enabled.
4
Webhook endpoint reachable
From your dev shell run the sample POST shown in the generated handler comments. Your handler should log a 200 OK.
5
Signature verification works
Tamper one byte of the body and re-POST — your handler should reject with 401. That’s Ed25519 doing its job. Your webhook secret never leaves your server.
You’re live.
Send a test payment to your address from any wallet. The next confirmed transfer will POST to your webhook within seconds. Open the live status page to watch listener uptime.
Audit pending · tracking issue → Bug bounty · coming via Immunefi Static analysis on every PR
ZettaPay is 100% open-source. Every endpoint, every signature, every line of code is on GitHub. We never custody — payments flow directly between your customer’s wallet and your address.
Copied to clipboard