PaymentsPayment operationsReverse

Reverse

Undo a captured payment before it settles — faster than a refund because funds never leave the issuer.

View as MarkdownInstall skills

A reversal undoes a captured payment on the same business day, before settlement completes. Because the funds have not yet moved out of the issuer's holding, a reversal resolves faster than a standard refund — typically within hours rather than days.

OperationWhen to useTiming
CancelAuthorization not yet capturedImmediate
ReverseCaptured, not yet settled (same day)Hours
RefundAlready settled5–10 business days (cards)

The reversal window is typically the same business day as the capture. Once settlement runs, the payment can no longer be reversed — use a refund instead.

Reverse via APIAsk

import { Vinr } from '@vinr/sdk';

const vinr = new Vinr({ secretKey: process.env.VINR_SECRET_KEY });

const reversal = await vinr.payments.reverse('pay_3Nf8x2a');

// reversal.status → "pending"
curl -X POST https://api.vinr.com/v1/payments/pay_3Nf8x2a/reverse \
  -H "X-Api-Key: $VINR_SECRET_KEY"

The response has status: "pending" — the reversal is processed asynchronously. If the settlement window has already closed, VINR automatically converts the reversal into a standard refund and you receive a refund.created event instead.

Reverse in VINR DashboardAsk

  1. Go to Dashboard → Payments.
  2. Open the payment.
  3. Select Reverse and confirm.

The option is only shown while the payment is eligible for reversal. If the window has passed, the button is replaced by Refund.

WebhooksAsk

EventWhen it fires
payment.reversedReversal accepted and processed.
refund.createdSettlement window closed — VINR converted the reversal to a standard refund.
const event = vinr.webhooks.verify(rawBody, req.headers['x-vinr-signature']);

switch (event.type) {
  case 'payment.reversed':
    await markOrderReversed(event.data.paymentId);
    break;
  case 'refund.created':
    // Reversal converted to refund — track the refund lifecycle instead
    await trackRefund(event.data.id);
    break;
}

Next stepsAsk

Was this page helpful?
Edit on GitHub

Last updated on

On this page