curl --request POST \
--url https://api.vibepay.mn/v1/transactions/{txID}/reverse \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.vibepay.mn/v1/transactions/{txID}/reverse"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.vibepay.mn/v1/transactions/{txID}/reverse', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vibepay.mn/v1/transactions/{txID}/reverse",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vibepay.mn/v1/transactions/{txID}/reverse"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.vibepay.mn/v1/transactions/{txID}/reverse")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vibepay.mn/v1/transactions/{txID}/reverse")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_bodyReverse a charge in full
Credits the full original amount back to the cardholder’s wallet and marks the charge reversed. There is no request body and no amount parameter: partial refunds are not supported.
Only a CHARGE belonging to the calling merchant can be reversed, and only once. This route additionally enforces the POS refund policy: the charge must have been taken by the calling terminal within the last 30 minutes. Anything older, or taken by another terminal, returns a 403 with a machine-readable code — those refunds are made by a merchant admin in the Vibepay merchant dashboard instead. Reversal also works while the wallet is suspended, so a freeze never traps a customer’s money.
The VAT receipt is voided at the tax authority asynchronously, and if the charge was already paid out in an earlier settlement cycle the amount is netted against the merchant’s next payout. Neither step blocks or delays this call.
curl --request POST \
--url https://api.vibepay.mn/v1/transactions/{txID}/reverse \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.vibepay.mn/v1/transactions/{txID}/reverse"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.vibepay.mn/v1/transactions/{txID}/reverse', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vibepay.mn/v1/transactions/{txID}/reverse",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vibepay.mn/v1/transactions/{txID}/reverse"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.vibepay.mn/v1/transactions/{txID}/reverse")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vibepay.mn/v1/transactions/{txID}/reverse")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_bodyAuthorizations
Per-terminal HTTP Basic credentials, issued in the Vibepay merchant dashboard under Terminals. The username starts with term_ and the password with vpt_. Every authentication failure — missing header, unknown username, wrong password, suspended terminal — returns the same 401, so the response can never be used to discover valid usernames.
Path Parameters
The id returned by the original charge, including its tx_ prefix.
^tx_[0-9a-hjkmnp-tv-z]{26}$Response
Reversed. The response body is empty — refetch the transaction if you need its updated state.

