skills/paystack-disputes/SKILL.md
Paystack Disputes API — manage transaction disputes (chargebacks) on your integration. List, fetch, update, resolve, and export disputes. Provide evidence, upload supporting documents, and handle resolution workflows. Use this skill whenever dealing with chargebacks, dispute management, fraud claims, refund disputes, providing evidence for contested transactions, or monitoring dispute status. Also use when you see references to /dispute endpoint, dispute statuses (awaiting-merchant-feedback, pending, resolved), or need to upload dispute evidence files.
npx skillsauth add rexedge/paystack paystack-disputesInstall 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 Disputes API lets you manage chargebacks and disputes on your integration.
Depends on: paystack-setup for the
paystackRequesthelper.
| Method | Endpoint | Description |
| --- | --- | --- |
| GET | /dispute | List disputes |
| GET | /dispute/:id | Fetch a dispute |
| GET | /dispute/transaction/:id | List disputes for a transaction |
| PUT | /dispute/:id | Update a dispute |
| POST | /dispute/:id/evidence | Add evidence |
| GET | /dispute/:id/upload_url | Get upload URL for attachment |
| PUT | /dispute/:id/resolve | Resolve a dispute |
| GET | /dispute/export | Export disputes |
| Status | Description |
| --- | --- |
| awaiting-merchant-feedback | Paystack is waiting for your response |
| awaiting-bank-feedback | Bank is reviewing evidence |
| pending | Dispute is being processed |
| resolved | Dispute has been resolved |
const disputes = await paystackRequest(
"/dispute?from=2024-01-01&to=2024-12-31&status=awaiting-merchant-feedback"
);
const dispute = await paystackRequest(`/dispute/${disputeId}`);
const txDisputes = await paystackRequest(`/dispute/transaction/${transactionId}`);
// Returns { history: [...], messages: [...] }
Accept a dispute and set refund amount:
await paystackRequest(`/dispute/${disputeId}`, {
method: "PUT",
body: JSON.stringify({
refund_amount: 1002, // Amount in subunits
uploaded_filename: "qesp8a4df1xejihd9x5q", // From upload URL
}),
});
await paystackRequest(`/dispute/${disputeId}/evidence`, {
method: "POST",
body: JSON.stringify({
customer_email: "[email protected]",
customer_name: "John Doe",
customer_phone: "0802345167",
service_details: "Customer purchased premium plan on Jan 5",
delivery_address: "123 Main Street, Lagos",
delivery_date: "2024-01-06",
}),
});
const upload = await paystackRequest(
`/dispute/${disputeId}/upload_url?upload_filename=receipt.pdf`
);
// upload.data.signedUrl → Use PUT to upload file to this S3 URL
// upload.data.fileName → Reference this in update/resolve calls
await paystackRequest(`/dispute/${disputeId}/resolve`, {
method: "PUT",
body: JSON.stringify({
resolution: "merchant-accepted", // or "declined"
message: "Customer refund approved",
refund_amount: 500000,
uploaded_filename: "uploaded_file_ref",
evidence: 21, // Evidence ID (optional, for fraud claims)
}),
});
const exported = await paystackRequest(
"/dispute/export?from=2024-01-01&to=2024-12-31"
);
// exported.data.path → CSV download URL
// 1. List pending disputes
const disputes = await paystackRequest(
"/dispute?status=awaiting-merchant-feedback"
);
for (const dispute of disputes.data) {
// 2. Get upload URL for evidence
const upload = await paystackRequest(
`/dispute/${dispute.id}/upload_url?upload_filename=evidence.pdf`
);
// 3. Upload file to signed URL (use your preferred HTTP client)
// await uploadToS3(upload.data.signedUrl, fileBuffer);
// 4. Add evidence
await paystackRequest(`/dispute/${dispute.id}/evidence`, {
method: "POST",
body: JSON.stringify({
customer_email: "[email protected]",
customer_name: "Customer Name",
customer_phone: "08012345678",
service_details: "Service was delivered successfully",
}),
});
// 5. Resolve — decline the chargeback
await paystackRequest(`/dispute/${dispute.id}/resolve`, {
method: "PUT",
body: JSON.stringify({
resolution: "declined",
message: "Service was delivered. Evidence attached.",
refund_amount: 0,
uploaded_filename: upload.data.fileName,
}),
});
}
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.
tools
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.
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.