Back to 0fee
0fee

One API, 53+ Providers, 200+ Countries

How 0fee.dev unifies 53+ payment providers across 200+ countries into one API. Code examples, routing logic, and coverage. By Juste A. Gnimavo.

Thales & Claude | March 25, 2026 11 min 0fee
api-designsdkpayment-providersdeveloper-experienceglobal-coverage

The core promise of 0fee.dev is radical simplicity: one API integration replaces dozens of provider-specific implementations. Behind that simplicity is a routing engine that maps every payment request to the optimal provider based on country, currency, payment method, cost, and real-time performance metrics. This article walks through the complete provider map, the routing logic, the SDK experience, and the code you actually write.

The Complete Provider Map

0fee integrates with 53+ payment providers organized by region and capability:

Global Providers

ProviderCoverageMethodsStrengths
Stripe46+ countriesCards, wallets (Apple Pay, Google Pay), SEPA, ACHBest card processing globally
PayPal200+ countriesPayPal balance, cards via PayPalUbiquitous buyer trust
Wise (TransferWise)80+ countriesBank transfers, multi-currencyLow-cost cross-border transfers
Adyen60+ countriesCards, wallets, local methodsEnterprise-grade, omnichannel
SquareUS, CA, UK, AU, JP, IE, FR, ESCards, Cash AppIn-person + online

Africa -- Mobile Money

ProviderCountriesKey Methods
PawaPay21+ countriesM-Pesa, MTN MoMo, Airtel Money, Orange Money, Tigo Pesa, Vodacom
Hub2Ivory Coast, Senegal, Mali, Burkina Faso, Togo, Benin, Guinea, CameroonOrange Money, MTN MoMo, Moov Money, Wave
PaiementProIvory Coast, Senegal, Burkina Faso, Togo, BeninMobile money + Visa/Mastercard
BUIIvory Coast, Senegal, Mali, Burkina FasoMobile money, cards
PaystackNigeria, Ghana, South Africa, KenyaCards, bank transfer, USSD, mobile money
Flutterwave30+ African countriesCards, mobile money, bank transfers, USSD
Cellulant (Tingg)35+ African countriesMobile money, cards, bank transfers
CinetPay15+ Francophone African countriesMobile money, cards
CampayCameroonMTN MoMo, Orange Money
NotchPayCameroon, Ivory Coast, SenegalMobile money, cards

Asia-Pacific

ProviderCountriesKey Methods
RazorpayIndiaUPI, cards, wallets, net banking
PhonePeIndiaUPI
GCashPhilippinesE-wallet
GrabPaySoutheast AsiaE-wallet
PromptPayThailandBank transfer
LINE PayJapan, Taiwan, ThailandE-wallet
AlipayChina, globalE-wallet
WeChat PayChina, globalE-wallet

Latin America

ProviderCountriesKey Methods
MercadoPagoArgentina, Brazil, Mexico, Chile, Colombia, UruguayCards, Pix, Boleto, wallets
PagSeguroBrazilPix, Boleto, cards
OXXOMexicoCash voucher
ConektaMexicoCards, OXXO, SPEI

Middle East and North Africa

ProviderCountriesKey Methods
Tap PaymentsUAE, Saudi Arabia, Kuwait, Bahrain, Qatar, Oman, Egypt, JordanCards, Apple Pay, wallets
FawryEgyptCash, wallets, cards
HyperPaySaudi Arabia, UAE, Jordan, EgyptCards, mada, Apple Pay

Country Coverage

The following table shows a representative sample of country coverage. The full list encompasses 200+ countries:

RegionCountriesPrimary MethodsPrimary Providers
North AmericaUS, CACards, ACH, walletsStripe, PayPal, Square
Western EuropeUK, FR, DE, ES, IT, NL, BECards, SEPA, iDEAL, BancontactStripe, Adyen, PayPal
Eastern EuropePL, CZ, RO, HUCards, local transfersStripe, Adyen
West Africa (Francophone)CI, SN, ML, BF, TG, BJ, GN, CMOrange Money, MTN MoMo, Wave, MoovHub2, PaiementPro, PawaPay
West Africa (Anglophone)NG, GHCards, bank transfer, MTN MoMoPaystack, Flutterwave
East AfricaKE, TZ, UG, RWM-Pesa, MTN MoMo, Airtel MoneyPawaPay, Flutterwave
Southern AfricaZA, MZ, ZM, MWCards, mobile moneyPaystack, PawaPay
Central AfricaCM, CD, CGMTN MoMo, Orange Money, AirtelPawaPay, Hub2
South AsiaINUPI, cards, walletsRazorpay
Southeast AsiaPH, TH, SG, MY, IDE-wallets, cards, bank transferGrabPay, various local
East AsiaCN, JPAlipay, WeChat Pay, cardsAlipay, LINE Pay
Latin AmericaBR, MX, AR, CO, CLPix, Boleto, OXXO, cardsMercadoPago, Conekta
MENAAE, SA, EG, JOCards, mada, walletsTap Payments, Fawry

How Routing Works

When your application sends a payment request to 0fee, the routing engine executes a multi-step decision process:

Step 1: Country Detection

The country field in the request (ISO 3166-1 alpha-2) determines which providers are eligible. Each provider has a registered list of supported countries.

Step 2: Method Matching

The method field (e.g., PAYIN_ORANGE_CI, PAYIN_CARD) filters providers to those that support the requested payment method in the given country.

Step 3: Credential Verification

The engine checks whether the merchant's application has valid, active credentials for each eligible provider. A provider without configured credentials is excluded.

Step 4: Provider Scoring

Each remaining provider receives a composite score based on:

pythondef calculate_provider_score(
    provider: Provider,
    app_config: AppRoutingConfig
) -> float:
    # Real-time success rate (last 24 hours)
    success_weight = 0.35
    success_score = provider.metrics.success_rate_24h

    # Average latency (lower is better)
    latency_weight = 0.20
    latency_score = 1.0 - min(provider.metrics.avg_latency_ms / 10000, 1.0)

    # Transaction cost (lower is better)
    cost_weight = 0.25
    cost_score = 1.0 - min(provider.fee_percent / 5.0, 1.0)

    # Merchant priority (configured in dashboard)
    priority_weight = 0.20
    priority_score = app_config.get_priority(provider.id) / 10.0

    return (
        success_weight * success_score +
        latency_weight * latency_score +
        cost_weight * cost_score +
        priority_weight * priority_score
    )

Step 5: Selection and Failover

The highest-scoring provider is selected as the primary. The second and third are queued as failover targets. If the primary returns a non-retryable error (provider down, maintenance, rate limit), the engine automatically retries with the next provider.

Request: Pay 5,000 XOF via Orange Money in CI
  |
  +-> Score: Hub2 (0.92) -- PRIMARY
  +-> Score: PaiementPro (0.87) -- FAILOVER 1
  +-> Score: PawaPay (0.81) -- FAILOVER 2
  |
  Hub2 processes successfully -> done
  Hub2 fails (503) -> retry PaiementPro -> success

This failover mechanism is invisible to the merchant. They send one request and receive one response. The routing and retry logic is entirely internal.

The SDK Experience

0fee provides SDKs in seven languages. Each SDK wraps the REST API with type-safe models, automatic retries, and idiomatic patterns for each language.

Installation

bash# Node.js / TypeScript
npm install zerofee

# Python
pip install zerofee

# PHP
composer require zerofee/zerofee-php

# Ruby
gem install zerofee

# Go
go get github.com/zerofee/zerofee-go

# Java
// Maven
<dependency>
  <groupId>dev.zerofee</groupId>
  <artifactId>zerofee-java</artifactId>
  <version>1.0.0</version>
</dependency>

# C#
dotnet add package ZeroFee

TypeScript Example: Full Payment Flow

typescriptimport { ZeroFee } from 'zerofee';

const zf = new ZeroFee({
  apiKey: process.env.ZEROFEE_API_KEY!,
  environment: 'live'  // or 'test'
});

// 1. Create a payment
const payment = await zf.payments.create({
  amount: 25_00,          // $25.00 in cents
  currency: 'USD',
  country: 'US',
  method: 'PAYIN_CARD',
  customer: {
    email: '[email protected]',
    name: 'John Doe'
  },
  metadata: {
    orderId: 'order_12345',
    productName: 'Pro Plan'
  },
  returnUrl: 'https://yourapp.com/payment/success',
  cancelUrl: 'https://yourapp.com/payment/cancel'
});

console.log(payment.checkoutUrl);
// -> https://checkout.0fee.dev/pay_abc123

// 2. Check payment status
const status = await zf.payments.get(payment.id);
console.log(status.status);
// -> 'pending' | 'completed' | 'failed' | 'expired'

// 3. Issue a refund
const refund = await zf.refunds.create({
  paymentId: payment.id,
  amount: 25_00,  // full refund
  reason: 'Customer requested cancellation'
});

Python Example: Mobile Money Payment

pythonfrom zerofee import ZeroFee

zf = ZeroFee(api_key="zf_live_...")

# Create an Orange Money payment in Ivory Coast
payment = zf.payments.create(
    amount=10000,           # 10,000 XOF
    currency="XOF",
    country="CI",
    method="PAYIN_ORANGE_CI",
    customer={"phone": "+2250700112233"},
    metadata={"invoice_id": "INV-2026-001"},
    return_url="https://yourapp.com/callback"
)

print(f"Payment ID: {payment.id}")
print(f"Status: {payment.status}")
# Customer receives USSD push on their phone

# List recent payments with filtering
payments = zf.payments.list(
    country="CI",
    status="completed",
    limit=50,
    offset=0
)

for p in payments.data:
    print(f"{p.id}: {p.amount} {p.currency} - {p.status}")

Webhook Handling (Express.js)

typescriptimport express from 'express';
import { ZeroFee } from 'zerofee';

const app = express();
const zf = new ZeroFee({ apiKey: process.env.ZEROFEE_API_KEY! });

app.post('/webhooks/zerofee', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.headers['x-zerofee-signature'] as string;

  try {
    const event = zf.webhooks.verify(req.body, signature);

    switch (event.type) {
      case 'payment.completed':
        // Fulfill the order
        fulfillOrder(event.data.metadata.orderId);
        break;

      case 'payment.failed':
        // Notify the customer
        notifyPaymentFailed(event.data.customer.email);
        break;

      case 'refund.completed':
        // Update order status
        markOrderRefunded(event.data.paymentId);
        break;
    }

    res.status(200).json({ received: true });
  } catch (err) {
    console.error('Webhook verification failed:', err);
    res.status(400).json({ error: 'Invalid signature' });
  }
});

Available Payment Methods by Category

0fee supports 117 payment methods organized into five categories:

Cards (Global)

MethodDescription
PAYIN_CARDVisa, Mastercard, Amex, Discover, JCB, UnionPay
PAYIN_CARD_3DSCards with mandatory 3D Secure authentication

Mobile Money (Africa)

MethodCountries
PAYIN_ORANGE_*CI, SN, ML, BF, CM
PAYIN_MTN_*GH, CM, UG, CI, BJ
PAYIN_MPESA_*KE, TZ
PAYIN_WAVE_*SN, CI
PAYIN_MOOV_*CI, BJ, TG
PAYIN_AIRTEL_*UG, TZ, KE
PAYIN_VODACOM_*TZ, MZ
PAYIN_TIGO_*TZ

Bank Transfers

MethodCountries
PAYIN_SEPAEU/EEA
PAYIN_ACHUS
PAYIN_WIREGlobal
PAYIN_PIXBR
PAYIN_SPEIMX
PAYIN_IDEALNL
PAYIN_BANCONTACTBE
PAYIN_UPIIN

Digital Wallets

MethodAvailability
PAYIN_APPLE_PAYUS, UK, EU, AU, CA, SG, HK, JP
PAYIN_GOOGLE_PAYUS, UK, EU, AU, CA, SG, IN
PAYIN_PAYPAL200+ countries
PAYIN_ALIPAYCN, global
PAYIN_WECHAT_PAYCN, global
PAYIN_GRABPAYSG, MY, PH, TH
PAYIN_GCASHPH

Cash and Vouchers

MethodCountries
PAYIN_OXXOMX
PAYIN_BOLETOBR
PAYIN_FAWRYEG

Pricing

0fee charges a flat 0.99% per successful transaction. That is it.

Feature0fee.devTypical Competitors
Transaction fee0.99%2.5% - 3.5%
Monthly fee$0$0 - $500+
Setup fee$0$0 - custom
Provider markupPass-throughOften marked up
Minimum commitmentNoneOften annual
Africa coverage50+ countriesLimited or none

The 0.99% fee is the orchestration layer cost. Provider fees (Stripe's 2.9%, PawaPay's variable rates, etc.) are passed through at cost. The merchant sees a transparent breakdown: orchestration fee + provider fee = total cost per transaction.

Getting Started: Five Minutes to Global Payments

bash# 1. Install the SDK
npm install zerofee

# 2. Get your API key at dashboard.0fee.dev

# 3. Start accepting payments
typescriptimport { ZeroFee } from 'zerofee';

const zf = new ZeroFee({ apiKey: 'zf_test_...' });

// Accept a payment from anywhere in the world
const payment = await zf.payments.create({
  amount: 1000,
  currency: 'USD',
  country: 'US',
  method: 'PAYIN_CARD',
  customer: { email: '[email protected]' },
  returnUrl: 'https://localhost:3000/success'
});

console.log(`Checkout: ${payment.checkoutUrl}`);

Test mode uses simulated providers that mirror real provider behavior -- including asynchronous mobile money flows with configurable delays and failure scenarios. When you are ready to go live, swap zf_test_ for zf_live_, configure your provider credentials in the dashboard, and your integration is production-ready.

One API. Fifty-three providers. Two hundred countries. Zero monthly fees.


This article is part of the "How We Built 0fee.dev" series. 0fee.dev is a payment orchestrator covering 53+ providers across 200+ countries, built by Juste A. GNIMAVO and Claude from Abidjan with zero human engineers. Follow the series for the complete build story.

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles