skills/paystack-verification/SKILL.md
Paystack Verification API — KYC verification tools for resolving bank accounts, validating account ownership, and looking up card BIN information. Use this skill whenever verifying bank account details before transfers, confirming account holder names, validating customer identity for compliance, looking up card brand/type/bank from BIN, or implementing KYC flows. Also use when you see references to /bank/resolve, /bank/validate, /decision/bin endpoints, or need to match account numbers to names.
npx skillsauth add rexedge/paystack paystack-verificationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
The Verification API provides KYC tools for account resolution, validation, and card BIN lookups.
Depends on: paystack-setup for the
paystackRequesthelper.
Related: paystack-miscellaneous for fetching bank codes.
| Method | Endpoint | Description |
| --- | --- | --- |
| GET | /bank/resolve | Resolve account number to name |
| POST | /bank/validate | Validate account ownership |
| GET | /decision/bin/:bin | Resolve card BIN |
Confirm an account belongs to the right customer. Returns the account holder's name.
| Param | Type | Required | Description |
| --- | --- | --- | --- |
| account_number | string | Yes | Bank account number |
| bank_code | string | Yes | Bank code (from List Banks endpoint) |
const resolved = await paystackRequest<{
account_number: string;
account_name: string;
}>("/bank/resolve?account_number=0022728151&bank_code=063");
// resolved.data.account_name → "WES GIBBONS"
async function verifyAccountBeforeTransfer(
accountNumber: string,
bankCode: string,
expectedName: string
) {
const resolved = await paystackRequest<{
account_number: string;
account_name: string;
}>(`/bank/resolve?account_number=${accountNumber}&bank_code=${bankCode}`);
const resolvedName = resolved.data.account_name.toLowerCase();
const expected = expectedName.toLowerCase();
if (!resolvedName.includes(expected)) {
throw new Error(
`Account name mismatch: "${resolved.data.account_name}" does not match "${expectedName}"`
);
}
return resolved.data;
}
Full account validation with identity document verification. Use before sending money.
| Param | Type | Required | Description |
| --- | --- | --- | --- |
| account_name | string | Yes | Customer's first and last name |
| account_number | string | Yes | Account number |
| account_type | string | Yes | personal or business |
| bank_code | string | Yes | Bank code |
| country_code | string | Yes | Two-letter ISO code (e.g. NG, ZA, GH) |
| document_type | string | Yes | identityNumber, passportNumber, or businessRegistrationNumber |
| document_number | string | No | Identity document number |
const validation = await paystackRequest<{
verified: boolean;
verificationMessage: string;
accountAcceptsDebits: boolean;
accountAcceptsCredits: boolean;
accountHolderMatch: boolean;
accountOpen: boolean;
}>("/bank/validate", {
method: "POST",
body: JSON.stringify({
bank_code: "632005",
country_code: "ZA",
account_number: "0123456789",
account_name: "Ann Bron",
account_type: "personal",
document_type: "identityNumber",
document_number: "1234567890123",
}),
});
// validation.data.verified → true
// validation.data.verificationMessage → "Account is verified successfully"
Get card brand, type, and issuing bank from the first 6 digits of a card number:
const card = await paystackRequest<{
bin: string;
brand: string;
sub_brand: string;
country_code: string;
country_name: string;
card_type: string; // "DEBIT" | "CREDIT"
bank: string;
}>("/decision/bin/539983");
// card.data.brand → "Mastercard"
// card.data.card_type → "DEBIT"
// card.data.bank → "Guaranty Trust Bank"
development
Paystack webhook integration — signature validation with HMAC SHA512, event parsing, IP whitelisting, retry policy, and all supported event types. Use this skill whenever setting up a webhook endpoint for Paystack, validating x-paystack-signature headers, handling charge.success or transfer.success events, debugging webhook delivery failures, implementing idempotent event processing, or building any server-side Paystack event listener. Also use when encountering webhook timeout issues or needing the list of Paystack webhook IP addresses.
development
Paystack Transfers API — send money to bank accounts and mobile wallets. Initiate single and bulk transfers, finalize OTP-verified transfers, list, fetch, and verify transfer status. Use this skill whenever implementing payouts, disbursements, vendor payments, withdrawal flows, or any feature that sends money from your Paystack balance to recipients. Also use when you see references to transfer_code, TRF_ prefixed codes, the /transfer endpoint, or need to handle transfer OTP verification.
development
Paystack Transfer Recipients API — create, list, fetch, update, and delete transfer recipients (beneficiaries) for payouts. Supports NUBAN (Nigeria), GHIPSS (Ghana), Mobile Money, BASA (South Africa), and authorization-based recipients. Use this skill whenever adding bank accounts or mobile wallets as payout destinations, creating transfer recipients before initiating transfers, managing beneficiary lists, or doing bulk recipient creation. Also use when you see references to recipient_code, RCP_ prefixed codes, or the /transferrecipient endpoint.
development
Paystack Transactions API — initialize payments, verify transactions, list/fetch transaction history, charge saved authorizations, view timelines, get totals, export data, and perform partial debits. Use this skill whenever building a checkout flow, verifying payment status, recharging a returning customer's saved card, pulling transaction reports or analytics, exporting transaction CSVs, or handling any transaction-related Paystack endpoint. Also use when you see references to /transaction/initialize, /transaction/verify, authorization_url, access_code, or charge_authorization in Paystack integrations.