Products
Solutions
Developers
Pricing
Company
Get started Sign in

Payments · Orchestration · Offline

Get paid on every rail.
Even offline.

One API for bank transfer, QR, wallets, vouchers and tap to pay with no network, with cards, USSD and mobile money coming. Routing across providers. Settlement the next business day, or the same day when you ask.

  1. 1 Connected
  2. 2 Offer sent
  3. 3 Accepted
  4. 4 Signed
  5. 5 Confirmed
A tap with no network, settled the moment the network returns.

Every way your customers pay. One object.

Why PediWave

Every rail

Bank transfer, QR, wallets, vouchers and offline taps, from one payment_intent with one status and one webhook. Cards, USSD, mobile money and agent cash are next.

Resilient

Rules choose the provider for each payment. A decline that is safe to retry cascades to the next provider; a timeout is checked first, so no customer is charged twice.

₦25,000 · Card · NGN Rule: cards, Nigeria Provider B · 0.88 Provider A · 0.91

Offline

Keys held in secure hardware, every tap signed by both devices, settled when the network returns, with the loss policy chosen before the first tap.

One checkout, every rail. The customer picks; you get one webhook.

Accept payments

Your checkout speaks every rail.

Send customers to hosted Checkout or share a Payment Link that also carries a QR, so it can be paid from any banking app. Send invoices by SMS or WhatsApp. Take bank transfers to an account number made for that payment. Cards with 3DS and local step-ups, and USSD codes on every link, are coming.

Accept payments
POST /v1/offline/batches
// Terminal "Till 3" reconnects and uploads 43 signed taps
// POST /v1/offline/batches
// Authorization: Bearer tk_live_…
// Idempotency-Key: term_01J9…-118

// → 200 OK
{
  "id": "obat_01J9ZQ…",
  "sequence": 118,
  "accepted": 41,
  "failed": 1,
  "quarantined": 1,
  "gap_detected": false,
  "items": [ /* 43 results */ ]
}
Every tap carries two signatures. A tap that fails is kept as evidence, never silently dropped.

Offline payments

Get paid where the network isn't.

Enrol a terminal, set its limits and accept taps with no signal on either side. When the terminal is back online it uploads the signed taps in one batch and each one settles. You choose in advance who carries the loss if a tap is ever double-spent.

How offline works
Every decision is recorded and can be simulated before a rule goes live.

Orchestration

Route every payment to the provider most likely to approve it.

Write rules once and test them against a simulate endpoint that explains every decision. When a provider declines for a reason that is safe to retry, the payment cascades to the next. When a call times out, PediWave asks the provider what happened before it tries again.

Live health scoring Coming

Orchestration
Retries follow when customers are paid, not a fixed three days later.

Billing & subscriptions

Recurring payments on every rail, retried when your customers are paid.

Bill by direct debit mandate, wallet autodebit, or a transfer invoice for customers on feature phones, with USSD invoices and card on file coming. When a charge fails, retries follow a schedule built around payday, and a backup method can step in.

Smart Dunning Coming

Billing & subscriptions
The account name is confirmed before money moves.

Payouts & transfers

Pay anyone, the same day.

Send single and bulk transfers with the account name confirmed before any money moves and approvals above the amount you set. Run payroll on a schedule, settle your balance the same day when you ask, and split each payment to the parties it belongs to.

Payouts & transfers
The deposit is queued on the terminal and credited when it uploads. The agent's float moves with it.

Banks & agents

Deposits and withdrawals at the POS, with or without a network.

Your agents take cash deposits and give withdrawals at a POS that keeps working offline, against floats you fund and control. Customers without a phone can withdraw with a cash-out code. Your core banking system stays the customer's ledger, and PediWave reconciles with it daily.

Banks & agents

Also on PediWave: Platforms & marketplaces Escrow Coming

Developers

Built the way you'd build it.

  • Idempotency-Key on every call that moves money. Retry after a dropped connection and get the same answer, never a second charge.
  • Signed, timestamped webhooks. Verify each delivery and reject replays.
  • A date-versioned API. Your integration keeps working when we ship.
  • A sandbox for every rail. Simulate transfers, USSD, card declines and offline taps.
Code sample language
POST /v1/payment/intents
import PediWave from "@pediwave/node";
const pediwave = new PediWave(process.env.PEDIWAVE_SECRET_KEY);

const intent = await pediwave.paymentIntents.create({
  amount: 250000,                // ₦2,500.00, in kobo
  currency: "NGN",
  reference: "ORD-1001",
  payment_method_types: ["bank_transfer", "qr", "offline"],
}, { idempotencyKey: "ORD-1001-1" });

// → 201 Created
// { "id": "pi_01J9ZK3M7Q8R1S2T3U4V5W6X7Y", "object": "payment_intent",
//   "amount": 250000, "currency": "NGN",
//   "status": "requires_payment_method", "livemode": false }

// Later, on your webhook endpoint:
// PediWave-Event-Type: payment_intent.succeeded
// PediWave-Signature: t=1759918530,v1=5257a869e7…
import os, pediwave
client = pediwave.Client(os.environ["PEDIWAVE_SECRET_KEY"])

intent = client.payment_intents.create(
    amount=250000,               # ₦2,500.00, in kobo
    currency="NGN",
    reference="ORD-1001",
    payment_method_types=["bank_transfer", "qr", "offline"],
    idempotency_key="ORD-1001-1",
)

# → 201 Created
# { "id": "pi_01J9ZK3M7Q8R1S2T3U4V5W6X7Y", "object": "payment_intent",
#   "amount": 250000, "currency": "NGN",
#   "status": "requires_payment_method", "livemode": false }

# Later, on your webhook endpoint:
# PediWave-Event-Type: payment_intent.succeeded
# PediWave-Signature: t=1759918530,v1=5257a869e7…
curl https://api.pediwave.com/v1/payment/intents \
  -H "Authorization: Bearer sk_test_…" \
  -H "Idempotency-Key: ORD-1001-1" \
  -H "PediWave-Version: 2026-10-01" \
  -H "Content-Type: application/json" \
  -d '{"amount": 250000, "currency": "NGN", "reference": "ORD-1001",
       "payment_method_types": ["bank_transfer", "qr", "offline"]}'

# → 201 Created
# { "id": "pi_01J9ZK3M7Q8R1S2T3U4V5W6X7Y", "object": "payment_intent",
#   "amount": 250000, "currency": "NGN",
#   "status": "requires_payment_method", "livemode": false }

# Later, on your webhook endpoint:
# PediWave-Event-Type: payment_intent.succeeded
# PediWave-Signature: t=1759918530,v1=5257a869e7…
Create a payment intent, read the response, verify the webhook.

Made for how your sector pays.

Different sectors pay on different rails. See the mix that fits yours.

Security

Start accepting payments today.

A test key in five minutes. Talk to us about offline, banks and platforms.