Skip to main content
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 usd gate is the simplest path — no user_ref, no account block; funds land in your omnibus.
The 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. onSuccess is a UX signal only — credit the customer from the webhook, not from this callback.
This is the hosted, embedded model. See Render the payment moment for the in-app, hosted-page, and headless alternatives.
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.
Credit a customer only after a verified disbursement.completed webhook. Client-side callbacks such as onSuccess are UX signals — they can be spoofed. The signed webhook is the only source of truth for crediting a user.
6

Drive it in the sandbox

Point the SDK at your sandbox key (sk_test_*). Simulate the full lifecycle without funds — each call fires the real signed webhooks:
A full happy path is: create session → deposit_detecteddeposit_confirmeddisburse → receive disbursement.completed → credit.