Skip to main content
Paylink lets you refund any successful payment, either in full or partially. Refunds are processed asynchronously — after you initialize a refund, poll the status endpoint or listen for a webhook event to confirm completion.

Initialize a Refund

Send a POST request to /refunds/initialize to start a refund:
Request

Full vs. Partial Refunds

The amount field controls whether a refund is full or partial:
  • Full refund — set amount to the exact amount of the original payment.
  • Partial refund — set amount to any value less than the original payment amount.
You can issue multiple partial refunds against a single payment as long as their total does not exceed the original charge.
account_number and bank_code may be required depending on the original payment method. If the customer paid by card and their card cannot be credited directly, you must provide a destination bank account.
A successful response confirms the refund has been queued:
Response
Each refund_reference must be unique across all your refund requests. Submitting a duplicate refund_reference returns a 409 error. Generate a new reference for every refund attempt, even if you are retrying a failed one.

Track Refund Status

Get a Single Refund

Call GET /refunds/{refund_reference} to fetch the current status of a specific refund:
Request
Response

Refund Statuses

Rather than polling repeatedly, set up a webhook listener to receive a notification when the refund status changes to success or failed.

List All Refunds for a Payment

To see every refund associated with a specific original payment, call GET /refunds/transactions/{payment_reference}:
Request
This is useful when a payment has received multiple partial refunds and you need to reconcile the total amount refunded.

Query Refund History

Retrieve a paginated list of all refunds across your merchant account at GET /merchants/refunds:
Example request

Get Refund Counts by Status

For a quick summary of your refund activity, call GET /refunds/count-by-status:
Request
Response
This endpoint is handy for dashboard widgets or monitoring alerts — for example, alerting your team when the failed count spikes unexpectedly.