What’s live today — updated 2026-07-23. The direct engine APIs — quotes, rates,
offramp, onramp, and bank resolution, called from your backend with an
sk_ API key —
are live and reconciled against the Pulse engine. The embedded collection product
documented here (server-minted cs_ client sessions, the drop-in components, and signed
webhooks) is in preview: it runs against the sandbox today, and order lifecycle is
observed by polling collectionOrders.retrieve rather than by webhook.
Treat the client-session and webhook shapes as provisional until they land on the engine —
details in Contract status.1
Install the backend SDK
@pulsebyshiga/node is the server component of Pulse. It runs only on your backend,
holds your API key, and talks to Pulse over HTTPS.2
Create a collection session
Construct the client once with your API key, then mint a session. The The
usd gate is
the simplest path — no user_ref, no account block; funds land in your omnibus.naira gate carries per-user identity instead: add user_ref and an account
block — { provision: true, bvn, nin } for a first-time customer (Pulse provisions
the virtual account), or { provision: false, virtual_account_ref } for a returning
one.3
Hand the session token to your frontend
Return only
session.session_token to the client. Never expose your sk_ key.4
Render the payment moment
Mount the embedded component with the session token. This is the hosted, embedded model. See
Render the payment moment for the in-app, hosted-page,
and headless alternatives.
onSuccess is a UX signal
only — credit the customer from the webhook, not from this callback.5
Verify the webhook
Delivery is at-least-once and signed (
Pulse-Signature, HMAC-SHA256 over the
raw body). verifyOnce verifies the signature, checks replay tolerance, and
de-duplicates on event id — it returns null for a redelivery.In preview, the sandbox delivers these webhooks. Against the live engine today the
webhook surface isn’t live yet, so you observe lifecycle by polling
collectionOrders.retrieve — the handler below is how it will
work once webhooks land.6
Drive it in the sandbox
Point the SDK at your sandbox key (A full happy path is: create session →
sk_test_*). Simulate the full lifecycle
without funds — each call fires the real signed webhooks:deposit_detected → deposit_confirmed →
disburse → receive disbursement.completed → credit.