Built for the people who build
A small, predictable API surface. If it exists in the dashboard, it exists in the API — and both run on the same mock data in this demo.
1 · Get your keys
Sign up and grab a pair of test keys. Test mode simulates confirmations so you can build without moving real funds.
2 · Create a payment
One POST to /v1/payments returns a hosted checkout URL and a raw deposit address — use whichever fits your flow.
3 · Listen for webhooks
Register an endpoint and verify the signature header. payment.succeeded fires when confirmations hit your threshold.
4 · Go live
Swap test keys for live keys. Nothing else changes — same endpoints, same payloads, same dashboard.
Core endpoints
Base URL: https://api.payzup.io
/v1/paymentsCreate a payment intent and get a hosted checkout URL or raw deposit address.
/v1/payments/{id}Retrieve a payment with confirmation count and settlement status.
/v1/payment_linksCreate a reusable payment link with fixed or open amounts.
/v1/payoutsSend a payout to a bank account or crypto address in one call.
/v1/conversionsConvert between supported assets at a guaranteed quoted rate.
/v1/settlementsList fiat settlements with per-transaction breakdowns.
/v1/cardsIssue a virtual card with spend limits and category controls.
/v1/webhook_endpointsRegister an endpoint to receive signed event notifications.
import crypto from "node:crypto";
export function verify(req) {
const sig = req.headers["payzup-signature"];
const mac = crypto
.createHmac("sha256", process.env.WH_SECRET)
.update(req.rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(sig), Buffer.from(mac)
);
}Webhook events
payment.createdsigned · retried 3×payment.succeededsigned · retried 3×payment.failedsigned · retried 3×refund.updatedsigned · retried 3×payout.paidsigned · retried 3×settlement.paidsigned · retried 3×card.transaction.createdsigned · retried 3×dispute.openedsigned · retried 3×