Skip to main content

Web SDK (TypeScript / JavaScript)

The official PayKore SDK for Node.js. Provides typed methods for every API endpoint, automatic request signing, and a structured error class.


Installation​

npm install @paykore/sdk
# or
yarn add @paykore/sdk
danger

This SDK is for server-side Node.js use only. Never import or bundle it into browser/frontend code, doing so would expose your secret API key to anyone who opens your site's developer tools.


Initialisation​

import PayKore from '@paykore/sdk';

const paykore = new PayKore({
apiKey: process.env.PAYKORE_SECRET_KEY!,
environment: 'live', // or 'sandbox'
timeout: 30_000, // optional, default 30s
});
OptionRequiredDescription
apiKeyYesYour secret key. Use sk_live_* with environment: 'live', or sk_test_* with environment: 'sandbox'.
environmentYes'live' or 'sandbox'. Must match your key's prefix, mismatches return 401 INVALID_API_KEY.
timeoutNoRequest timeout in milliseconds. Defaults to 30,000 (30s).

To develop against sandbox, switch both values together:

const paykore = new PayKore({
apiKey: process.env.PAYKORE_SANDBOX_KEY!, // sk_test_...
environment: 'sandbox',
});

Wallets​

// Create a wallet
const wallet: Wallet = await paykore.wallets.create({
userRef: 'user_123',
currency: 'NGN',
});

// Fetch a wallet
const wallet: Wallet = await paykore.wallets.get('wlt_9f3kA2mXpQ');

// List a wallet's transaction history
const page: PaginatedList<Transaction> = await paykore.wallets.listTransactions(
'wlt_9f3kA2mXpQ',
{ type: 'p2p_transfer', limit: 20 }
);
MethodReturns
paykore.wallets.create(params)Promise<Wallet>
paykore.wallets.get(id)Promise<Wallet>
paykore.wallets.listTransactions(id, params)Promise<PaginatedList<Transaction>>

See the Wallets guide for full field-level documentation.


Transfers​

import { randomUUID } from 'crypto';

// P2P transfer: always pass an idempotency key
const transfer: Transaction = await paykore.transfers.p2p({
sourceWalletId: 'wlt_9f3kA2mXpQ',
destWalletId: 'wlt_3pRsT7uVwX',
amountKobo: 500000,
reference: 'order_789',
idempotencyKey: randomUUID(),
});

// Bank transfer: requires a bankAccount object
const payout: Transaction = await paykore.transfers.bank({
sourceWalletId: 'wlt_9f3kA2mXpQ',
bankAccount: {
bankCode: '058',
accountNumber: '0123456789',
accountName: 'ADEBAYO OLUWASEUN JAMES',
},
amountKobo: 1000000,
reference: 'payout_456',
idempotencyKey: randomUUID(),
});
MethodReturns
paykore.transfers.p2p(params)Promise<Transaction>
paykore.transfers.bank(params)Promise<Transaction>

See P2P Transfers and Bank Transfers for full guides, including async lifecycle for bank transfers.


Payments​

// Create a QR payment intent (merchant side)
const intent = await paykore.payments.createQRIntent({
merchantWalletId: 'wlt_mErChAnT456',
amountKobo: 500000,
reference: 'order_789',
});

// Pay a QR intent (payer side)
const payment = await paykore.payments.payQRIntent({
intentId: intent.intentId,
payerWalletId: 'wlt_9f3kA2mXpQ',
});

// Initiate a USSD payment
const ussdSession = await paykore.payments.initiateUSSD({
payerWalletId: 'wlt_9f3kA2mXpQ',
merchantWalletId: 'wlt_mErChAnT456',
amountKobo: 500000,
reference: 'order_789',
});

// Split payment
const splitTx = await paykore.payments.split({
sourceWalletId: 'wlt_buYeR789',
amountKobo: 1000000,
reference: 'order_456',
splitConfig: {
merchantAccount: 'wlt_seller_123',
platformFeePercent: 15.0,
platformAccount: 'wlt_your_platform',
},
});
MethodReturns
paykore.payments.createQRIntent(params)Promise<QRIntent>
paykore.payments.payQRIntent(params)Promise<Transaction>
paykore.payments.initiateUSSD(params)Promise<USSDSession>
paykore.payments.split(params)Promise<Transaction>

See QR Payments, USSD Payments, and Split Payments for full guides.


KYC​

// Submit a BVN for verification
const kyc = await paykore.kyc.submitBVN({
userRef: 'user_123',
bvn: '22190000000',
});

// Check verification status
const status = await paykore.kyc.getStatus('user_123');
console.log(status.status); // "verified" | "processing" | "failed"
MethodReturns
paykore.kyc.submitBVN(params)Promise<KYCVerification>
paykore.kyc.getStatus(userRef)Promise<KYCVerification>

See the KYC Verification guide for verification thresholds and failure reasons.


Webhooks​

// Register an endpoint
const endpoint = await paykore.webhooks.register({
url: 'https://yourapp.com/webhooks/paykore',
events: ['transaction.completed', 'transaction.failed'],
});

// List registered endpoints
const endpoints = await paykore.webhooks.list();

// Delete an endpoint
await paykore.webhooks.delete('wh_5rTuV2wXyZ');
MethodReturns
paykore.webhooks.register(params)Promise<WebhookEndpoint>
paykore.webhooks.list()Promise<WebhookEndpoint[]>
paykore.webhooks.delete(id)Promise<void>

See the Webhooks Overview for delivery behaviour, and Verifying Signatures for handling incoming payloads, signature verification is a separate, manual step the SDK does not currently perform for you on the receiving end.


Error handling​

All SDK methods throw a PayKoreError on failure. Catch it and branch on err.code:

import { PayKoreError } from '@paykore/sdk';

try {
const transfer = await paykore.transfers.p2p({ /* ... */ });
} catch (err) {
if (err instanceof PayKoreError) {
switch (err.code) {
case 'INSUFFICIENT_FUNDS':
// handle: show the user their balance and the shortfall
break;
case 'WALLET_FROZEN':
// handle: surface a support contact path
break;
default:
// unexpected error, log for investigation
logger.error('Unexpected paykore error', { code: err.code, requestId: err.requestId });
}
} else {
throw err; // not a paykore error, rethrow
}
}

PayKoreError exposes three properties you'll use constantly:

PropertyDescription
err.codeThe paykore error code (e.g. INSUFFICIENT_FUNDS). Stable across SDK versions, branch on this, not on err.message.
err.statusCodeThe underlying HTTP status code (e.g. 422).
err.requestIdThe meta.request_id value from the API response. Include this when escalating to PayKore support, it lets the team locate the exact request in logs.

TypeScript types​

The SDK exports the following types from the package root, so you can import them directly without reaching into internal paths:

import type {
Wallet,
Transaction,
FeeBreakdown,
LedgerEntry,
KYCVerification,
WebhookEndpoint,
PayKoreError,
} from '@paykore/sdk';
TypeRepresents
WalletA user's wallet, including balance and NUBAN details.
TransactionAny completed/processing/failed business event (transfer, payment, payout).
FeeBreakdownThe fee fields attached to a Transaction.
LedgerEntryA single immutable debit/credit record underlying a transaction.
KYCVerificationThe status and metadata of a BVN/NIN verification attempt.
WebhookEndpointA registered webhook URL and its subscribed events.
PayKoreErrorThe error class thrown by all SDK methods on failure.

SDK changelog​

v1.0.0: Initial release. Covers wallets, P2P transfers, bank transfers, QR payments, USSD payments, split payments, KYC (BVN), and webhook management.


Next steps​