Open banking payments · UK & EU

Customers pay from their bank. The money goes straight to yours.

ZyroPay adds pay by bank to your checkout with one API call and one button. Your customer approves in their banking app, their bank pays your account directly, and a signed webhook tells your server the order is paid. We never hold your money.

  • Domestic & instant rails
  • Strong customer authentication
  • Signed webhooks
Northbound OutfittersOrder ORDER-1001
Completed
£49.99GBP
pay_3f8c… · minorUnits 4999
  1. Bank chosenPayer picked Monzo on the hosted checkout
  2. Approved in banking appFace ID, on the bank's own screen
  3. Submitted to the bankInstant rail, bank to your account
  4. Webhook sentpayment.completed · signed
Fulfil the orderCOMPLETED
DirectPayer's bank to your account, never via us
1 tagAdds a pay by bank button to any page
SecondsTo settle when the bank supports instant
0Card chargebacks, by design
Checkout

A pay by bank checkout without building one.

Drop the ZyroPay button into your page. It opens a hosted checkout where the customer picks their country and bank, confirms the amount, and approves in their banking app. You never build a bank list or a consent screen.

One drop-in button

Add <pay-button> and point it at your create endpoint. Your API key stays on your server; the browser only ever sees a payment id.

Money goes straight to you

The payer's bank pays your registered account directly. ZyroPay orchestrates the approval and never pools or holds funds.

Start on desktop, approve on phone

On a computer the checkout shows a QR code. The customer approves on their phone and the desktop page completes by itself.

Survives the bank redirect

With resume on, the button reconnects to the payment when the customer comes back from their bank, so your thank-you screen still appears.

Instant where the bank allows

Ask for INSTANT and DOMESTIC together. Payments use the instant rail whenever the customer's bank supports it and fall back to standard otherwise.

In your customer's language

The hosted checkout and receipts page offer a language switch, and the bank list is filtered to banks that can take the payment.

How a payment moves

We move the approval. Your customer's bank moves the money.

Your site & server pay-button · sk_ key ZyroPay checkout country → bank → confirm Payer's bank approval in app (SCA) Your bank account registered at onboarding 1 create payment 2 consent request 3 funds, direct 4 signed webhook payment.completed ZyroPay never holds the money
ZyroPay creates the payment and gets the payer's consent (steps 1 and 2). The money itself goes from the payer's bank to your registered account (step 3, green) without passing through us. When the payment finishes, we send your server a signed webhook (step 4), which is your signal to fulfil the order.
Hosted checkout

Four taps from basket to bank.

Your customer chooses their country, then their bank from a list filtered to banks that support the payment. They confirm the amount and your business name, then continue to their bank to approve.

  • QR handoff on desktop. Customers who start on a computer can scan and approve on their phone. The desktop page updates by itself, and the desktop button disables itself so the payment can't be started twice.
  • Receipts for your customers. Payers can see the payments they've made on that device, with nothing to sign up for.
  • Unfinished payments tidy themselves up. If the customer cancels or never picks a bank, the payment is cancelled after about 60 minutes.
Merchant portal

Every payment and its status, in one list.

Sign in to the merchant portal to see your payments as they move from created to completed. Filter by status or rail, and match each one to your order by its reference.

  • Read-only by design. The portal uses its own dashboard token, separate from your API key, so sharing it with your finance team can't create payments.
  • Eight clear statuses. From CREATED to COMPLETED, with REJECTED, FAILED and CANCELLED kept distinct.
  • Search by rail. See which payments actually went over the instant rail and which used standard domestic.
Payments
All statusesGBP
ReferenceStatusRailAmount
ORDER-1001CompletedInstant£49.99
ORDER-1000Awaiting authorisation—£120.00
ORDER-0999CompletedDomestic€86.40
ORDER-0998RejectedInstant£19.99
ORDER-0997Cancelled—£64.50
Developers

A small integration, done properly.

Read two sections, copy the reference implementation, and you're done. No SDK to install: it's plain HTTPS and JSON, so any language works.

  1. Create a payment on your server

    POST the amount in minor units and your order reference, with your API key and an Idempotency-Key.

  2. Add the button

    Load pay.js and add <pay-button>. It calls your endpoint and opens the checkout.

  3. Fulfil on the webhook

    Verify the HMAC signature, then mark the order paid once. Browser events are for the thank-you screen only.

REST + JSONIdempotency-KeyHMAC-SHA256120 req/min
// POST /api/checkout (your backend)
app.post("/api/checkout", async (req, res) => {
  const order = await db.getOrder(req.body.orderId);
  const r = await fetch("https://pay.zyropay.net/api/merchant/payment/requests", {
    method: "POST",
    headers: {
      "x-api-key": process.env.ZYROPAY_API_KEY,
      "Idempotency-Key": order.id,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      amount: { minorUnits: order.minorUnits, currency: "GBP" },
      reference: order.id,
    }),
  });
  const payment = await r.json();
  res.json({ id: payment.id });   // only the id goes to the browser
});
Security by design

Even a leaked API key can't send your money elsewhere.

A payment request has no payee field. Every payment settles to the bank account registered for you at onboarding, and only your operator can change it. Each credential does one job, so losing one exposes as little as possible.

  • Checkout only on your domains. The checkout can only be embedded on the domains you register, enforced in the browser.
  • Your own webhook secret. Each merchant gets a signing secret issued once at onboarding, never a shared key.
  • No bank logins, ever. Customers approve on their own bank's screen. We never see their credentials, and we never echo account numbers back in a response.
CredentialsLeast privilege
CredentialLives inCan do
sk_live_…Your serverCreate and read payments
pay_…The browserView and pay one payment
dash_…Merchant portalView payments, read-only
webhookSecretYour serverVerify our webhooks
Coverage

Banks across the UK and Europe.

ZyroPay initiates payments through Yapily's open banking network. Your customer picks their country, and the checkout shows only banks that support the payment you asked for.

  • GBUnited KingdomGBP
  • IEIrelandEUR
  • DEGermanyEUR
  • FRFranceEUR
  • ESSpainEUR
  • ITItalyEUR
  • NLNetherlandsEUR
  • BEBelgiumEUR
  • ATAustriaEUR
  • PTPortugalEUR
  • FIFinlandEUR
  • +More in the EUEUR

Bank availability changes as banks update their open banking services. Ask us about a specific bank or market.

Take your first pay by bank payment.

Try the full flow in the sandbox today. Once onboarding is complete, we register your settlement account and issue your live API key, webhook secret and portal token.