Money Out

Refunds

 

Refund card transactions back to the cardholder's original card. Pass the transaction ID of the original charge with a reason, with support for partial refunds, status tracking, and webhook notifications.

Request

Request a refund of a previously settled card transaction by passing the transaction_id (tra_) of the original charge and a reason. The funds are returned to the card used on the original transaction — no card details are required.

The full transaction amount is refunded by default; pass amount for a partial refund. Multiple partial refunds may be issued against the same transaction, up to the original transaction amount in total. Only settled card transactions (transaction status PAID) can be refunded.

Card transaction IDs are returned by Checkout Link, Checkout Form, Card Vault Charge, and captured Card Vault Pre-Auth holds, or can be found via transactions.

Path

POST /refunds/{transaction_id}/request

Path ParameterTypeDescriptionExample
transaction_idString(32)The original settled card transaction to refund — see transactionstra_pr6CvR_4pvWwmgQ4y3dtY

Example (Basic)

Refund the full transaction amount.

{
  "reason": "Order cancelled by customer" // recorded against the refund and shown in reporting
}

Example (Advanced)

Partial refund with all options.

{
  "reason": "Item returned — partial refund for one of two items", // recorded against the refund and shown in reporting

  "amount": "150.00", // [optional] must be <= the remaining refundable amount; omit to refund in full

  "reference": "REF-2026-00042", // [optional] your reference for this refund; defaults to the original transaction reference

  "signature": "secret-key-for-payload", // [optional] shared-secret signature for the payload, see the signature section below

  "notification": {
    "email": "me@my-email.co.za", // [optional] email notification on the refund outcome
    "webhook_url": "https://merchant.example/webhooks/payments" // webhook on refund.successful / refund.failed
  },

  "metadata": {
    "order_id": "ord_98765" // [optional] custom key/value pairs returned on the refund and webhooks
  }
}

Request Parameters

Field
RequiredType
Description
Example
reasonYString(512)Reason for the refund; recorded against the refund and shown in reportingOrder cancelled by customer
amountNStringAmount to refund; must be less than or equal to the remaining refundable amount. Omit to refund the full transaction150.00
referenceNString(35)Your reference for this refund; defaults to the original transaction referenceREF-2026-00042
signatureNStringOptional passphrase signature for verifying the payloadsecret-key-for-payload
notification.emailNStringEmail address to notify on the refund outcomeme@my-email.co.za
notification.webhook_urlNStringWebhook URL for the refund outcomehttps://merchant.example/webhooks/payments
metadataNObjectCustom key/value metadata returned on the refund and webhooks{"order_id": "ord_98765"}

Response Body

A refund (ref_) is created against the original transaction (tra_). Refunds are submitted to the card schemes for processing and are typically reflected on the cardholder's statement within 3–5 business days; the refund is created with status PENDING and moves to REFUNDED or FAILED once processed — see the webhook section for outcome notifications.

{
    "status": true,
    "result": {
      "id": "ref_Hj4TmN8wQxLv2pYcE6aBz",
      "transaction_id": "tra_pr6CvR_4pvWwmgQ4y3dtY",
      "customer_id": "cus_abc123...",
      "refund_status": "PENDING",
      "amount": "150.00",
      "refundable_amount": "199.00",
      "currency": "ZAR",
      "reference": "REF-2026-00042",
      "reason": "Item returned — partial refund for one of two items",
      "created_at": "2026-07-06T10:15:30Z"
    }
}

Response Parameters

Field
Type
Description
Example
statusBooleanWhether the refund request was acceptedtrue
result.idString(32)Unique refund identifierref_Hj4TmN8wQxLv2pYcE6aBz
result.transaction_idString(32)The original transaction being refundedtra_pr6CvR_4pvWwmgQ4y3dtY
result.customer_idString(32)Customer associated with the original transaction, when applicablecus_abc123...
result.refund_statusENUMRefund state: PENDING, REFUNDED, or FAILED, see lookupsPENDING
result.amountStringAmount being refunded150.00
result.refundable_amountStringAmount still refundable on the original transaction after this refund199.00
result.currencyString(3)ISO 4217 currency codeZAR
result.referenceString(35)Reference used for the refundREF-2026-00042
result.reasonString(512)Reason supplied on the refund requestItem returned — partial refund for one of two items
result.created_atStringISO timestamp when the refund was created2026-07-06T10:15:30Z

List

List the refunds on the platform.

Path

GET /refunds/list?{params}

Query Parameters

FieldRequired
Type
Description
Example
refund_idNString(32)ID of a specific refund to search for.ref_Hj4TmN8wQxLv2pYcE6aBz
transaction_idNString(32)Original transaction ID to filter for.tra_pr6CvR_4pvWwmgQ4y3dtY
customer_idNString(32)ID of a customer to search for.cus_cldM8OIXkGwBrfd5jjPdD
referenceNString(35)Refund reference to filter for.REF-2026-00042
refund_statusNENUMFilter for specific refund statuses. (PENDING,REFUNDED,FAILED)REFUNDED
date_created_startNDate(YYYY-MM-DD)Filter for records created on or after this date.2026-05-21
date_created_endNDate(YYYY-MM-DD)Filter for records created up to this date.2026-05-22

Response Body

{
  "status": true,
  "records": [{
    "id": "ref_Hj4TmN8wQxLv2pYcE6aBz",
    "transaction_id": "tra_pr6CvR_4pvWwmgQ4y3dtY",
    "customer_id": "cus_abc123...",
    "refund_status": "REFUNDED",
    "amount": "150.00",
    "currency": "ZAR",
    "reference": "REF-2026-00042",
    "reason": "Item returned — partial refund for one of two items",
    "metadata": {
      "order_id": "ord_98765"
    },
    "created_at": "2026-07-06T10:15:30Z",
    "completed_at": "2026-07-09T08:00:00Z"
  }, ...]
}

Response Parameters

Field
Type
Description
Example
statusBooleantrue - success, false - errortrue
recordsArray of objects
*.idString(32)Unique refund identifierref_Hj4TmN8wQxLv2pYcE6aBz
*.transaction_idString(32)The original transaction that was refundedtra_pr6CvR_4pvWwmgQ4y3dtY
*.customer_idString(32)Customer associated with the original transaction, when applicablecus_abc123...
*.refund_statusENUM(PENDING,REFUNDED,FAILED), see lookupsREFUNDED
*.amountStringRefunded amount150.00
*.currencyString(3)ISO 4217 currency codeZAR
*.referenceString(35)Reference used for the refundREF-2026-00042
*.reasonString(512)Reason supplied on the refund requestItem returned — partial refund for one of two items
*.metadataObjectCustom key/value metadata supplied on the refund request{"order_id": "ord_98765"}
*.created_atStringISO timestamp when the refund was created2026-07-06T10:15:30Z
*.completed_atStringISO timestamp when the refund reached its final status; null while pending2026-07-09T08:00:00Z

Signature creation

When creating API keys on the dashboard you can download a passphrase key, use it to generate your signature and send it in the signature parameter. The canonicalization and HMAC-SHA256 process is identical across all endpoints — see Checkout Link — Signature creation for Node.js, PHP, C#, Java, and Python examples.

Webhook

When a refund completes or fails, a webhook may be delivered to notification.webhook_url when that field was supplied on the refund request. Broader platform webhooks are configured separately if applicable.

Possible event values include refund.successful and refund.failed, listed under Webhook events.

Webhook Payload

{
  // refund.successful · refund.failed
  "event": "refund.successful",
  "data": [
    {
      "refund": {
        "id": "ref_Hj4TmN8wQxLv2pYcE6aBz",
        "transaction_id": "tra_pr6CvR_4pvWwmgQ4y3dtY",
        "customer_id": "cus_abc123...",
        "refund_status": "REFUNDED",
        "amount": "150.00",
        "currency": "ZAR",
        "reference": "REF-2026-00042",
        "reason": "Item returned — partial refund for one of two items",
        "metadata": {
          "order_id": "ord_98765"
        },
        "completed_at": "2026-07-09T08:00:00Z"
      }
    }
  ],
  "created_at": "2026-07-09T08:00:00Z"
}

Webhook Payload Parameters

Field
Type
Description
Example
eventStringType of webhook event that occurredrefund.successful
dataArrayArray containing refund data...
data.refund.idString(32)Unique refund identifierref_Hj4TmN8wQxLv2pYcE6aBz
data.refund.transaction_idString(32)The original transaction that was refundedtra_pr6CvR_4pvWwmgQ4y3dtY
data.refund.customer_idString(32)Customer associated with the original transaction, when applicablecus_abc123...
data.refund.refund_statusENUMRefund state after the event, see lookupsREFUNDED
data.refund.amountStringRefunded amount150.00
data.refund.currencyString(3)ISO 4217 currency codeZAR
data.refund.referenceString(35)Reference used for the refundREF-2026-00042
data.refund.reasonString(512)Reason supplied on the refund requestItem returned — partial refund for one of two items
data.refund.metadataObjectCustom key/value metadata supplied on the refund request{"order_id": "ord_98765"}
data.refund.completed_atStringISO timestamp when the refund reached its final status2026-07-09T08:00:00Z
created_atStringISO timestamp when webhook was created2026-07-09T08:00:00Z

Webhook Events

EventDescriptionTrigger ConditionData Included
refund.successfulThe refund was processed and the funds returned to the cardholderWhen the card scheme confirms the refundRefund details, original transaction reference
refund.failedThe refund could not be processedWhen the card scheme rejects the refund (e.g. the original card account is closed)Refund details with failure reason

Webhook Security

All webhooks are sent with the following headers for verification:

  • X-Signature: HMAC-SHA256 signature of the payload
  • X-Timestamp: Unix timestamp of when the webhook was sent
  • User-Agent: Kwik-Webhooks/1.0

Webhook Response

Your endpoint should respond with a 200 status code to acknowledge receipt. Failed webhooks will be retried up to 3 times with exponential backoff.