Payment Gateway

One API. Your rails. Built for teams that own their MIDs.

One integration across the card acquirer, Paystack, and mobile-money accounts you already run — hosted provider checkout, 3DS via your providers, automatic failover, and a reconciled ledger.

Integration architecture

Your checkout, one API, the provider accounts you already own.

Architecture diagram: merchant checkout, unified API layer, your provider accounts Your checkout EuPPay Unified API + failover + ledger CyberSource MPGS Paystack Paydock Paychtec

A single endpoint replaces N provider SDKs. These are your accounts and your MIDs — settlement never passes through us.

Same call, every provider

Initialize a payment with one call. Redirect. Confirm.

Plain REST — no SDK required. The response is a hosted-checkout URL on your provider, so card data never touches your servers or ours.

initialize-payment.sh
curl -X POST https://euppay.com/api/v1/payments/initialize \
  -H "X-Api-Key: $API_KEY" \
  -H "X-Api-Secret: $API_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "order_id": "ORD-42f7",
    "amount": 49.99,
    "currency": "KES",
    "customer_email": "ada@startup.io",
    "billing_address": "123 Biashara St, Nairobi, KE",
    "return_url": "https://your-site.com/payment/success",
    "cancel_url": "https://your-site.com/payment/cancel"
  }'

# → { "success": true, "action": "redirect",
#     "redirect_url": "https://…", "transaction_reference": "550e8400-…" }

Reliability

Built for the failure modes you actually see at 2am.

  • Automatic failover — technical failures on a provider retry on a backup provider you've connected. Covers outages, not declines.
  • Hosted provider checkout — card data is captured on your provider's hosted page, not our servers, reducing your PCI burden.
  • Server-side status API — confirm every payment before fulfilment instead of trusting the browser redirect.
  • Processing limits & velocity controls — per-merchant rules enforced before a transaction reaches any provider.
  • One reconciled ledger — every attempt, capture, and refund across rails with per-rail totals.
confirm-payment.php
// Confirm a payment server-side before fulfilling the order
$response = Http::withHeaders([
    'X-Api-Key'    => config('services.gateway.key'),
    'X-Api-Secret' => config('services.gateway.secret'),
])->get("https://euppay.com/api/v1/payments/{$reference}/status");

$payment = $response->json('data');

if (($payment['status'] ?? null) === 'completed') {
    Order::where('order_id', $payment['order_id'])->firstOrFail()->markPaid();
}

Security posture

What we actually do — and what stays with your providers.

Hosted capture

Card data is captured on your payment provider's hosted page — it doesn't touch our servers or yours, which reduces your PCI burden.

3DS

Issuer authentication runs on the provider's hosted flow where the issuer requires it.

No custody

Settlement flows from your providers to your bank accounts. EuPPay never holds your funds.

Controls

Per-merchant processing limits and velocity rules enforced before any provider is called.

Ready to ship the integration?

Sandbox access starts when you create an account. Card go-live is a scheduled project with your acquirer — we run it with you.