Refunds
Online Refund
Mandate: 17 April 2020
Enforcement: Effective 30 October 2025
All Visa and Mastercard refund transactions must now be processed through our online authorization system. This mandate, originally introduced on 17 April 2020, is now subject to strict compliance enforcement effective 30 October 2025.
Prior to the Mandate for credit voucher and merchandise return authorization messages, merchants made refunds offline with Transaction Code 06 = Credit voucher in a Financial Transaction (clearing). Now an online authorization must be made when a merchant initiates a refund. This is done first and foremost to shorten the time frame in which cardholders can expect to see confirmation of and receive refunds. Funds will not be released to the cardholder based on the authorization only, the Financial Transaction still controls the time of release.
In case of errors when making refunds, e.g., unintentional duplicates or wrong amount, the authorization can be reversed.
Visa MCC Restrictions
Refunds on these MCCs for Visa transactions are not allowed and will result in a rejected online refund.
| MCC | Description |
|---|---|
| 4829 | Money transfer |
| 6012 | Financial institutions - merchandise, services, and debt repayment |
| 6051 | Non-financial institutions - foreign currency, non-fiat currency (for example: cryptocurrency), money orders (not money transfer), account funding (not stored value load), travellers cheques, and debt repayment |
| 6540 | Non-financial institutions - stored value card purchase/load |
| 7995 | Betting, including lottery tickets, casino gaming chips, off-track betting, and wagers at race tracks |
Mastercard Exemptions
The following refund transactions are exempt from going online:
- Refund transactions conducted by airlines (acceptor business codes (MCCs) 3000 through 3350 as assigned to individual airlines and MCC 4511 [Air Carriers, Airlines: not elsewhere classified])
- Refund transactions conducted by railways using MCC 4112 (Passenger Railways)
- Refund transactions to commercial card accounts issued under select product codes, as described in the revised Standards
- Refund transactions conducted by contactless aggregated transit transaction merchants
- India domestic refund transactions
Authorization
Unlike standard authorizations, refunds do not require the same security fields. However, a refund must be linked to the original purchase authorization.
To achieve this:
- Include the TransLCID from the original sale transaction.
- For Mastercard transactions, also include the TransactionLinkID.
- Set the Refund parameter to 1.
- The transaction type used for a refund can differ from the original purchase, as not all the same data is required. For example, a 3-D Secure e-commerce purchase can be refunded using a MOTO transaction.
Successful refund responses are indicated by codes 00 (approved) and 85 (no reason to decline).
Reversal
Refund reversals follow the same protocol as other reversals. They must be matched to the original refund transaction. The only additional information needed is a new parameter Refund = 1.
Examples
Visa Refund Example
// code is compatible with .net8 console app
using System.Web;
using Microsoft.Extensions.DependencyInjection;
var service = new ServiceCollection();
service.AddHttpClient();
var client = service.BuildServiceProvider()
.GetService<IHttpClientFactory>()!
.CreateClient();
var parameters = new Dictionary<string, string>
{
{ "MsgType", "0100" },
{ "MsgSenderID", "[insert your username]" },
{ "MsgSenderAP", "[insert your password]" },
{ "MsgID", "123456" },
{ "MerchantXID", "2995652ABCDEFGH" },
{ "MerchantType", "5999" },
{ "TerminalID", "18101001" },
{ "CardType", "V" },
{ "CardNumber", "4761739001010010" },
{ "CardExpDate", "1812" },
{ "TransType", "10" },
{ "TransAmount", "25.5" },
{ "TransCurrency", "352" },
{ "TransTime", "230101" },
{ "TransDate", "0310" },
{ "MerchantName", "CIP*Billy shoes" },
{ "MerchantCity", "London" },
{ "Refund", "1" },
{ "TransLCID", "485301381526324" }
};
var request = new HttpRequestMessage(HttpMethod.Post, "https://authorization.acquiring.uat.valitor.com/process")
{
Content = new FormUrlEncodedContent(parameters)
};
HttpResponseMessage response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
var responseParameters = System.Web.HttpUtility.ParseQueryString(content);
// Process responseParameters here
}
else
{
// Handle error
}
Mastercard Refund Example
// code is compatible with .net8 console app
using System.Web;
using Microsoft.Extensions.DependencyInjection;
var service = new ServiceCollection();
service.AddHttpClient();
var client = service.BuildServiceProvider()
.GetService<IHttpClientFactory>()!
.CreateClient();
var parameters = new Dictionary<string, string>
{
{ "MsgType", "0100" },
{ "MsgSenderID", "[insert your username]" },
{ "MsgSenderAP", "[insert your password]" },
{ "MsgID", "123457" },
{ "MerchantXID", "2995652ABCDEFGH" },
{ "MerchantType", "5999" },
{ "TerminalID", "18101001" },
{ "CardType", "M" },
{ "CardNumber", "5555555555554444" },
{ "CardExpDate", "1812" },
{ "TransType", "10" },
{ "TransAmount", "25.5" },
{ "TransCurrency", "352" },
{ "TransTime", "230101" },
{ "TransDate", "0310" },
{ "MerchantName", "CIP*Billy shoes" },
{ "MerchantCity", "London" },
{ "Refund", "1" },
{ "TransLCID", "485301381Ab2C" },
{ "TransactionLinkID", "aRyU-3Ti981f_6WvBaqM03" }
};
var request = new HttpRequestMessage(HttpMethod.Post, "https://authorization.acquiring.uat.valitor.com/process")
{
Content = new FormUrlEncodedContent(parameters)
};
HttpResponseMessage response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
var responseParameters = System.Web.HttpUtility.ParseQueryString(content);
// Process responseParameters here
}
else
{
// Handle error
}
American Express Refund Example
// code is compatible with .net8 console app
using System.Web;
using Microsoft.Extensions.DependencyInjection;
var service = new ServiceCollection();
service.AddHttpClient();
var client = service.BuildServiceProvider()
.GetService<IHttpClientFactory>()!
.CreateClient();
var parameters = new Dictionary<string, string>
{
{ "MsgType", "0100" },
{ "MsgSenderID", "[insert your username]" },
{ "MsgSenderAP", "[insert your password]" },
{ "MsgID", "123458" },
{ "MerchantXID", "2995652ABCDEFGH" },
{ "MerchantType", "5999" },
{ "TerminalID", "18101001" },
{ "CardType", "A" },
{ "CardNumber", "378282246310005" },
{ "CardExpDate", "1812" },
{ "TransType", "10" },
{ "TransAmount", "25.5" },
{ "TransCurrency", "352" },
{ "TransTime", "230101" },
{ "TransDate", "0310" },
{ "MerchantName", "CIP*Billy shoes" },
{ "MerchantCity", "London" },
{ "Refund", "1" },
{ "TransLCID", "485301381526325" }
};
var request = new HttpRequestMessage(HttpMethod.Post, "https://authorization.acquiring.uat.valitor.com/process")
{
Content = new FormUrlEncodedContent(parameters)
};
HttpResponseMessage response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
var responseParameters = System.Web.HttpUtility.ParseQueryString(content);
// Process responseParameters here
}
else
{
// Handle error
}