Developer-First

Integrate once.
Iterate forever.

One REST API for every provider, method and rail. Clean payloads, predictable behaviour, versioned changes, no archaeology required. Swap providers in configuration, not in code.

"If your dev team hates the API, the product is lying."

Payment Intents

Create, confirm, capture payments with a single API

Webhooks

Real-time events for payments, settlements, disputes

Refunds & Payouts

Full and partial refunds, multi-rail payouts

Provider Abstraction

One interface, any provider, swap without code changes

Sandbox

Simulate declines, 3DS flows, retries, edge cases

How the integration works

You build against ZenPays objects, not against providers. Create a PaymentIntent, confirm it with a payment method, and the routing engine decides which provider and rail execute it; your code is identical whether the transaction settles through a card acquirer in Brazil or a stablecoin rail across a border. Refunds, payouts and disputes run through the same objects, so the integration you write on day one is the one you still run when your provider mix has changed five times.

Webhooks carry every lifecycle event: authorizations, captures, settlement confirmations, dispute updates. Events are signed and retried until acknowledged, and every API request accepts an idempotency key, because networks fail and double-charging a customer is not an acceptable failure mode. Errors come back in one consistent envelope with a reason you can act on programmatically; no parsing provider-specific mystery strings.

The sandbox simulates the ugly parts on purpose: soft declines, 3DS challenges, cascading retries, partial refunds, webhook replays. If your integration survives the sandbox, production holds no surprises. Sandbox access comes with a demo; request it here.

Core Objects

Simple, predictable data models.

PaymentIntent

Create, confirm, and capture payments

Customer

Store customer data and payment methods

Payout

Send funds to merchants and sellers

Refund

Process full or partial refunds

Dispute

Handle chargebacks and evidence

example.js
// Create a payment intent
const paymentIntent = await zenpays.paymentIntents.create({
amount: 10000,
currency: 'usd',
customer: 'cus_123abc',
routing: {
optimize_for: 'approval', // or 'cost', 'speed'
fallback_enabled: true
},
metadata: {
order_id: 'ord_456'
}
});
// Confirm with payment method
const confirmed = await zenpays.paymentIntents.confirm(
paymentIntent.id,
{
payment_method: 'pm_card_visa',
return_url: 'https://yoursite.com/complete'
}
);

Migration Path

"Wrap your existing stack first, then expand rails."

1
Connect existing providers through ZenPays layer
2
Enable routing and observability without changing checkout
3
Add new rails incrementally as coverage expands
4
Migrate traffic gradually with A/B testing