Card payments for Belize, with an API.

Take Visa and Mastercard online through the Belize Bank card gateway, without building the integration yourself. Hosted checkout, signed webhooks and a settlement ledger you can reconcile against.

Built on the Belize Bank card gateway · Settled in Belize dollars · PCI SAQ A for you

Recent paymentsTest mode
pi_ZHEE5GpP…PaidUS$25.00
pi_JuupquaS…HeldUS$60.00
pi_065kCUGn…IncompleteUS$42.00
curl https://api.secureprocessing.app/v1/payment_intents \
  -u sk_test_...: \
  -d amount=6000 \
  -d currency=usd \
  -d "description=SCU-B0161 — Blue Hole Two-Tank"
3independent paths settle every payment
~35hof signed webhook retries
2 minbetween reconciliation sweeps
$0monthly fee

Everything a payment needs, and nothing it does not

Hosted checkout

Send your customer to a page hosted by the bank. Card details never reach your servers or ours.

A real REST API

Payment intents, refunds, customers, saved cards and events. Idempotent, cursor-paginated, versioned.

Signed webhooks

Every event, signed and retried for about 35 hours, with a delivery log you can read and replay.

Saved cards

Store a card with the customer's consent and charge it later, without holding the number yourself.

Price in USD, settle in BZD

Charge what you quote. The payment records the rate it was taken at, and refunds use that same rate.

Test mode

A separate set of books and separate keys. Test payments can never appear in your live totals.

Three calls to your first payment

  1. 01

    Create a payment intent

    Say what you are charging and in which currency. Amounts are in minor units, so 6000 is $60.00.

    const intent = await sp.paymentIntents.create({
      amount: 6000,
      currency: "usd",
    });
  2. 02

    Create a checkout session

    You get back a URL. Send your customer there; the card is entered on the bank's page.

    const session = await sp.checkoutSessions.create({
      payment_intent: intent.id,
      success_url: "https://example.com/thanks",
    });
  3. 03

    Listen for the webhook

    payment_intent.succeeded arrives signed. Verify it, then fulfil the order.

    const event = await sp.webhooks.constructEvent(
      rawBody, signature, secret,
    );

The card number never reaches you. Or us.

Every flow we offer sends the customer to the bank's own page to type their card. That is what keeps you in scope for the shortest PCI questionnaire, and it is why there is nothing on our side worth stealing.

How we handle security
  • Signed webhooks

    Every delivery carries an HMAC signature and a timestamp. Rotate the secret with a 24-hour overlap.

  • Append-only ledger

    Double-entry, balanced by the database, and nothing can update or delete a posted entry.

  • Verified, not trusted

    The bank's callback is a hint. Money is only released after we ask the bank directly.

  • No passwords held by us

    Sign-in is by passkey or an emailed link, with an authenticator app as the second step.

Start in test mode

Create an account, take a test payment in a few minutes, and talk to us before you go live. Pricing is per successful payment with no monthly fee; the rate is being finalised with the bank.