REST · Webhooks · Idempotent

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

POST
/v1/payments

Create a payment intent and get a hosted checkout URL or raw deposit address.

GET
/v1/payments/{id}

Retrieve a payment with confirmation count and settlement status.

POST
/v1/payment_links

Create a reusable payment link with fixed or open amounts.

POST
/v1/payouts

Send a payout to a bank account or crypto address in one call.

POST
/v1/conversions

Convert between supported assets at a guaranteed quoted rate.

GET
/v1/settlements

List fiat settlements with per-transaction breakdowns.

POST
/v1/cards

Issue a virtual card with spend limits and category controls.

POST
/v1/webhook_endpoints

Register an endpoint to receive signed event notifications.

Verify a webhook (Node.js)
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×

Get your test keys

Create an account and head to Developers → API keys in the dashboard. Test mode is on by default.