Checkout

Your checkout, or ours.

Create a payment with one API call. Take the card inside your own checkout with our embedded card fields, with no redirect, or on a hosted page in your name. 3-D Secure and receipts are handled either way.

Embedded in your page, or hosted 3-D Secure handled A signed webhook when it’s paid

A customer checks out a £20.00 basket on Lumen Labs’ site. Lumen Labs’ server creates the payment with one API call and passes its client secret to the page, where a small React component shows Tuppence’s payment form: card, Apple Pay and Google Pay, inside Lumen Labs’ own checkout, with no redirect. The customer enters a card and presses Pay £20.00; their bank asks them to confirm it’s them; the checkout says Payment complete. The customer gets a receipt email.

A checkout from the server call and the React component to the payment form in the merchant’s own page, the bank’s check and the receipt.
How it works

One payment. Take the card where you like.

Your server creates the payment, ready for either way in. Choose per checkout. The webhook, receipt and fee are the same.

Keeps customers on your site

Embedded in your checkout

Hand the payment’s client_secret to your page and @tuppence/js mounts secure card fields in your checkout, in your branding. Your customer stays on your site and the bank’s check opens in place. Card details go from the browser straight to our PCI DSS Level 1 card processor, never to your server or ours.

import { loadTuppence } from "@tuppence/js";

const tuppence = await loadTuppence("pk_live_…");
const sheet = tuppence.paymentSheet({ clientSecret })
  .mount("#card");

// When your customer presses Pay:
const { error, payment } = await sheet.confirm();
The browser SDK
Nothing to build

A hosted pay page

No front end needed. Send your customer to the payment’s approval_url by redirect, email or a message from your agent. The page shows your name, logo and colour, runs the bank’s check and returns them once they’ve paid.

// The create response carries it:
{
  "id": "pay_01K…",
  "approval_url": "…/pay/pay_01K…"
}

// Then, on your server:
res.redirect(payment.approval_url);
Hosted pages in the docs
1

Create the payment

Your server calls POST /v1/payments with an amount in pence and an idempotency key, so a retried request never charges twice.

2

Take the card

In your checkout with client_secret and @tuppence/js, or on our page at approval_url. 3-D Secure runs if the bank asks.

3

Hear that it worked

A signed payment.succeeded webhook reaches your server, your customer gets a receipt, and the money joins your balance.

What checkout does

The hard parts of taking a card, handled.

Strong Customer Authentication

When a card needs 3-D Secure, the payment waits for the bank’s check and continues when it passes.

Cards on file

With the customer’s agreement (the terms are shown on the page), save their card and charge it later with /v1/payments/charge_saved, or save one with nothing charged.

Pre-authorisation

Hold the amount when the order is placed, then capture what it came to within six days, or release it.

Payments an agent starts

An AI agent can create a payment through the API or the MCP server, and the payer approves it on the hosted page. Saved cards are charged only under terms the payer agreed to.

Declines your customer understands

A refused card returns a message written for your customer. If a response is lost, the SDK checks what happened instead of sending the card again.

Your brand, either way

Display name, logo, accent colour (kept readable automatically), support contact and the text on your customer’s statement.

Receipts

A receipt email and a receipt page for every successful payment, in your branding.

Card-testing protection

A burst of declines pauses the payment link and alerts you, so it can’t be used to test stolen cards.

Unusual charges flagged

Charges that don’t fit an account’s or an agent’s normal pattern are flagged, and can require the customer to authenticate again.

The Payments API

Every step has an endpoint.

Test mode behaves like live, with test cards, test payouts, a test clock and helpers that open disputes or settle payouts on demand.

API reference
  • POST /v1/payments
  • POST /v1/payments/{id}/confirm
  • POST /v1/payments/{id}/capture
  • POST /v1/payments/{id}/cancel
  • POST /v1/payments/charge_saved
  • POST /v1/refunds
  • GET  /v1/balance
  • POST /v1/payouts
  • POST /v1/disputes/{id}/submit
  • POST /v1/webhook_endpoints

Payments that give more back.

Start in test mode in a minute. Go live once you’re verified.