Skip to content

SDKs

Every official Wajub package, what it needs to run, and which one your stack takes.

There is one Wajub API. Every package on this page is a thin wrapper over it, written in the idioms of its language, so nothing here does something the REST API cannot. What the wrappers buy you is authentication, retries, idempotency, typed errors and pagination that you would otherwise write once per project.

Most of this decision is made for you. The package follows from where your code runs, and the language follows from what you already write. What is left is checking that your runtime qualifies and that the package covers what you need.

Where your code runs

That question decides the package, and nothing else does.

Your code runsReach forBecause
On your serverA server SDKIt holds the secret key, so it can do everything
In a browserWajub ComponentsIt renders and confirms a checkout, nothing more
In a mobile appA mobile SDKIt renders a native payment sheet
In a terminalThe CLILocal webhook forwarding and test events, with a restricted rk. key
On WordPressA pluginNo integration code at all
Nowhere yetPayment Links or InvoiceA payable link, no code and no package
Anywhere elseThe REST APIEvery endpoint, documented for raw HTTP

Most integrations use two: a server SDK to create the payment, and a browser or mobile package to collect it. That split is not a style choice, it is where the secret key is allowed to be.

Already know your stack?

Jump straight there. Node.js, Python, PHP, Go, Ruby, Java, C#, JS, React, Vue, Svelte, Flutter, React Native, Android, iOS.

Server SDKs

Seven languages, one surface. They expose the same resources, so the difference between them is syntax rather than capability. PHP is at 2.0.1, Node.js and C# at 2.0.0, Ruby at 1.3.0, the others at 1.2.1.

LanguagePackageRegistryVersionRuntime
Node.js@wajub/nodenpm2.0.0Node 18+
PythonwajubPyPI1.2.1Python 3.10+, httpx
PHPwajub/wajub-phpPackagist2.0.1PHP 8.4+, Guzzle 8.2
Gogithub.com/wajubhq/wajub-goGo modulesv1.2.1Go 1.22+
RubywajubRubyGems1.3.0Ruby 3.1+, no runtime gems
Javacom.wajub:wajub-javaMaven Central1.1.1Java 17+, OkHttp
C# and .NETWajubNuGet1.1.1.NET 8+

Below the floor, call the REST API directly. It is HTTPS and JSON, and every endpoint on this site carries a raw example.

The same call, seven ways

Create a payment, get back a token for the browser and a URL for a redirect. This is the shape every server SDK shares.

curl https://api.wajub.com/payments \
-H "Authorization: sk_test.xxxxxxxxxxxxxxxx…" \
-H "Content-Type: application/json" \
-d '{"amount": 15000, "currency": "XAF", "customer": {"email": "buyer@example.com"}}'

Ruby, Java and C# read the same way in their own idiom. Each has its own page: Ruby, Java, C#.

What every server SDK gives you

The client is resource oriented. One object per API resource, the same names everywhere.

GroupResources
Money inpayments, refunds, disputes, links, invoices
Money outtransfers, beneficiaries, balance
People and accountscustomers, accounts, identity
Risk and complianceshield, tax
Plumbingevents, webhooks, webhookEndpoints, listen, global

Around them, the behaviour you would otherwise rebuild in every project.

  • An Idempotency-Key is generated for every mutating call, and you can pass your own.
  • Retries on 429 and 5xx, with exponential backoff.
  • One error class per failure kind, so authentication, validation, rate limiting and transport failures are told apart before you read a message.
  • Page based pagination with an iterator that fetches the next page for you.
  • Webhook signature verification, so the endpoint that receives events is one call away from being safe.
  • A Sync account reference per request, for platforms charging on behalf of their merchants.

Naming follows each language, snake_case in Python and Ruby, camelCase elsewhere (PHP methods included, listRefunds), while the wire format stays snake_case. The mapping is on SDK naming conventions.

In the browser

These render a checkout. They never hold a key, and they cannot refund, pay out or list anything. Your server creates the session first.

PackageFrameworkNeeds at leastVersion
@wajub/jsVanilla, bundler or CDNA browser that understands ES2020, and an ESM bundler or the CDN script1.8.1
@wajub/reactReact 18+, Next.jsReact 18, React DOM 181.8.1
@wajub/vueVue 3.3+, NuxtVue 3.31.8.1
@wajub/svelteSvelte, SvelteKitSvelte 4 or 51.8.1
@wajub/angularAngular 17+, Angular SSRAngular 17, @angular/core and @angular/common1.8.1

The four framework packages need @wajub/js installed beside them, 1.8.0 or later for @wajub/angular. It is a peer dependency, not a bundled one.

The four framework packages are wrappers around @wajub/js, which is itself a small loader that fetches the checkout runtime from https://js.wajub.com. The whole section has its own tree: Wajub Components.

In a mobile app

A native payment sheet against a session your server created. The customer picks an operator, enters a number, and approves from their phone without leaving your app.

PackagePlatformVersionNeeds at least
wajub_mobileFlutter1.1.1Flutter 3.24, Dart 3.5
@wajub/react-nativeReact Native1.1.1React Native 0.74, React 18, @react-native-community/netinfo and @react-native-async-storage/async-storage. @stripe/stripe-react-native for Stripe cards only
com.wajub:wajub-mobile-coreKotlin, any JVM1.2.1Java 17, Kotlin 2.0
com.wajub:wajub-mobile-composeAndroid1.2.1Android 7.0, API 24, and Jetpack Compose
WajubMobileUI, WajubMobileiOS1.0.0iOS 15, Swift 5.9, Xcode 15

Android ships as two artifacts, and you usually want both

wajub-mobile-core is a plain Kotlin and JVM library, no Android dependency, no manifest. It is the API client and the checkout's logic. wajub-mobile-compose is the Android archive that carries the Material 3 payment sheet and depends on the core. Take core alone only when you are building the payment interface yourself.

iOS ships as a Swift package

Two products of one Swift package, added with Swift Package Manager. WajubMobileUI carries the SwiftUI payment sheet and brings WajubMobile with it, the Foundation-only API client and checkout logic. Take WajubMobile alone when you build the payment interface yourself. Neither depends on Stripe: a Stripe card goes through a CardCollector your app writes. See iOS.

What each package covers

Coverage follows from where the code runs, not from the language. All seven server SDKs expose the same eighteen resources under the same names, so there is no feature reason to prefer one.

ProductServer SDKsBrowserMobile
Paymentspayments, refunds, disputes, linksCheckout onlyPayment sheet only
BillinginvoicesNoNo
Transferstransfers, beneficiaries, balanceNoNo
Syncaccounts, plus a per request account referenceNoNo
ShieldshieldNoNo
TaxtaxNoNo

Alongside those sit customers, identity, events, webhooks, webhookEndpoints, listen and global, which every server SDK also carries.

A preview or beta label belongs to the product, never to the SDK. The clients do not gate anything, so shield and tax are callable from every language today. Whether the product behind them is ready for your account is on its own page.

Constraints worth knowing before you commit

Two more things are worth knowing, and neither is obvious from a package listing.

The Go module path is not what it looks like

The import path is github.com/wajubhq/wajub-go. The organisation is wajubhq, and github.com/wajub/wajub-go resolves to nothing.

The Android group is com.wajub

Both Android artifacts are published under com.wajub, not co.wajub. A Gradle coordinate on the wrong group simply fails to resolve.

On the command line

@wajub/cli is the only package here that is not for production code. It forwards webhooks to your machine, triggers test events, and reads your API resources while you build.

PackageRegistryVersionRuntime
@wajub/clinpm, Homebrew, Scoop1.7.3Node 22+

Installation and every command are on the CLI pages.

Without an SDK

Nothing on this page is required. Each SDK is a few thousand lines over HTTPS and JSON, and the API reference documents every endpoint with request and response examples. That is the right path for a language with no official package, for an environment you cannot add a dependency to, and for anyone who prefers to see the wire.

Two more things to decide

Picking the package is not the same as picking the integration. Two separate choices remain, and both have their own page.

DecisionWhere
Hosted page, inline embed, overlay, or your own fieldsChoosing your payments integration
How API field names land in your languageSDK naming conventions

What did you think of this content?