Developer guide
VEXPay siteAPI reference
Browse documentation

Refund a payment or handle a chargeback

What you can refund on each method, how to reverse a Débito Inmediato (C2P) payment or refund a peso payment, and how card chargebacks hit your balance and get closed.

What you can refund

MethodCan you refund it?How
Débito Inmediato (C2P)Yes, in fullPOST /v1/payments/:id/reverse
Colombian pesosYes, in full, within 96 hours of completionPOST /v1/cop/payments/:id/refund
USDT / USDCNo refund APISend the buyer a normal stablecoin payout with POST /v1/crypto/payouts (payout fee applies)
CardNo refund APIOnly bank chargebacks, which VEXPay records
Pago Móvil, débito inmediato (OTP)No refund API—

Partial refunds are not supported. Subscribe your webhook endpoint to payment.reversed, payment.chargeback and payment.chargeback_closed.

Steps: reverse a Débito Inmediato (C2P) payment

  1. Check the payment

    GET /v1/payments/:id must show a COMPLETED C2P payment that was not reversed before.

  2. Reverse it

    POST /v1/payments/:id/reverse (up to 5 per hour). If the bank refuses, you get a 400 with its message and nothing changes.

  3. Confirm

    The payment becomes REVERSED and payment.reversed arrives with reversalType: "reversal". The full amount leaves your balance and the VEXPay fee is returned. On a split payment, the seller's share is undone too.

curlbash
curl --request POST "${API_URL}/v1/payments/PAYMENT_ID/reverse" \
  --header "x-api-key: ${VEXPAY_API_KEY}"

Steps: refund a peso payment

  1. Keep enough pesos

    Your COP balance (available plus held) must cover the net that was credited. Pesos you already converted or withdrew do not count.

  2. Refund it

    POST /v1/cop/payments/:id/refund within 96 hours of completion.

  3. Confirm

    The payment shows refunded and payment.reversed arrives with status: "refunded". The COP fee is returned.

What happens on a card chargeback

  1. The buyer disputes the charge

    VEXPay records the chargeback on the payment and debits your bolívar balance (the original card fee is not returned). If the bank charges a chargeback fee, VEXPay passes on exactly that amount as a separate movement (feeVes, often 0), with nothing added. You receive payment.chargeback; a full chargeback also sends payment.reversed with reversalType: "chargeback".

  2. Book it

    GET /v1/payments/:id lists chargebacks[], and the movements appear in GET /v1/balance/transactions?paymentId=…. Book each one once using the ledgerEntryIds in the webhook.

  3. VEXPay disputes it

    When it is decided you receive payment.chargeback_closed with outcome. Won: the amount and any chargeback fee come back (held for 24 hours) and the payment returns to COMPLETED. Lost: nothing further moves.

Check that it worked

  • In Test, pay with the card 4000000000000259: about a minute later a test chargeback arrives with livemode: false.
  • The reversal, refund or chargeback appears in Portal → Balance movements and the payment shows its new status in Payments.

If something goes wrong

SymptomLikely causeWhat to do
400 "Reversal is not supported for method: …"Only C2P payments can be reversedSee the table at the top.
400 "Only COMPLETED payments can be reversed"Wrong status, or already reversedCheck GET /v1/payments/:id.
400 with a bank messageThe bank refused the reversalContact VEXPay; the payment stays COMPLETED.
409 onward_payout_in_progressThe payment was already converted and sent on as USDTContact VEXPay.
429 on reverseMore than 5 reversals in an hourRetry later.
409 refund_window_expiredMore than 96 hours since the peso payment completedNo API refund is possible; contact VEXPay support.
409 insufficient_balance on a peso refundYour COP balance does not cover itKeep enough COP, then retry.

Related: Lookup & reversal · Reconcile your balance · Colombia (COP) · VPOS