curl --request POST \
--url https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund \
--header 'Content-Type: application/json-patch+json' \
--header 'x-revolv3-token: <api-key>' \
--data '
{
"amount": 5,
"includeRawProcessorResponse": false,
"reportGroup": null
}
'import requests
url = "https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund"
payload = {
"amount": 5,
"includeRawProcessorResponse": False,
"reportGroup": None
}
headers = {
"x-revolv3-token": "<api-key>",
"Content-Type": "application/json-patch+json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-revolv3-token': '<api-key>', 'Content-Type': 'application/json-patch+json'},
body: JSON.stringify({amount: 5, includeRawProcessorResponse: false, reportGroup: null})
};
fetch('https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund', 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-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 5,
'includeRawProcessorResponse' => false,
'reportGroup' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json-patch+json",
"x-revolv3-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund"
payload := strings.NewReader("{\n \"amount\": 5,\n \"includeRawProcessorResponse\": false,\n \"reportGroup\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-revolv3-token", "<api-key>")
req.Header.Add("Content-Type", "application/json-patch+json")
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-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund")
.header("x-revolv3-token", "<api-key>")
.header("Content-Type", "application/json-patch+json")
.body("{\n \"amount\": 5,\n \"includeRawProcessorResponse\": false,\n \"reportGroup\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-revolv3-token"] = '<api-key>'
request["Content-Type"] = 'application/json-patch+json'
request.body = "{\n \"amount\": 5,\n \"includeRawProcessorResponse\": false,\n \"reportGroup\": null\n}"
response = http.request(request)
puts response.read_body{
"invoice": {
"invoiceId": 2,
"parentInvoiceId": 1,
"customerId": 1,
"merchantInvoiceRefId": "ca552d9a-637c-49c5-b870-179be6e99e8d",
"paymentMethod": {
"paymentMethodId": 1,
"billingAddressId": 1,
"billingFirstName": "John",
"billingLastName": "Doe",
"merchantPaymentMethodRefId": null,
"billingAddress": {
"addressId": 1,
"addressLine1": "1 Default Street",
"addressLine2": null,
"city": "Los Angeles",
"state": "CA",
"postalCode": "90210",
"phoneNumber": null,
"email": null,
"country": "US"
},
"paymentMethodAchDetails": null,
"paymentMethodCreditCardDetails": null
},
"invoiceStatus": "PartialRefund",
"subtotal": 10.99,
"tax": 0.1,
"total": 11.09,
"billingDate": "30.06.2026",
"merchantLegalName": "John Doe",
"merchantCustomerRefId": "80a0b225-b38e-4971-b475-f36b8fef0457",
"customerFirstName": "John",
"customerLastName": "Doe",
"subscriptionId": null,
"installmentId": null,
"eligibilityFailReason": null,
"merchantSubscriptionRefId": null,
"networkTransactionId": null,
"currency": null,
"invoiceLineItems": null,
"invoiceAttempts": null,
"voidAttempts": null
},
"refunds": [
{
"invoiceAttemptId": 1,
"amount": -3.99,
"invoiceAttemptStatus": "Success",
"invoiceAttemptDate": "2026-07-01T11:31:34.8866527Z",
"paymentProcessor": "BridgePay",
"processorTransactionId": null,
"responseCode": null,
"responseMessage": null,
"processorRawResponse": null,
"paymentMethod": {
"paymentMethodId": 0,
"billingAddressId": 0,
"billingAddress": null,
"billingFirstName": null,
"billingLastName": null,
"merchantPaymentMethodRefId": null,
"paymentMethodAchDetails": null,
"paymentMethodCreditCardDetails": null
},
"descriptor": {
"subMerchantId": null,
"subMerchantName": null,
"subMerchantPhone": null,
"countryCode": null,
"city": null
},
"eligibilityCheckOrderCode": null,
"processorMerchantId": null,
"processingMethod": "None",
"revolv3ResponseCode": null,
"revolv3ResponseMessage": null,
"authCode": null,
"processorResponseDateTime": "2026-07-01T11:31:34.8866527Z"
}
],
"refundedSubtotal": 5.99,
"refundedTax": 0.05,
"refundedTotal": 6.04,
"rawResponse": null,
"message": null,
"responseCode": null,
"responseMessage": null,
"revolv3ResponseCode": null,
"revolv3ResponseMessage": null
}{
"message": "Unable to perform the request action with provided data."
}{
"message": "Attempted to perform an unauthorized operation."
}{
"message": "Unable to find an entity with the provided data."
}{
"message": "Unable to process this operation."
}Refund Invoice
Initiates a refund for a previously paid invoice. This endpoint allows full or partial refunds, depending on the amount specified in the request.
You must supply the unique invoiceId of the transaction to be refunded, along with the refund amount (for partial refund).
The system validates the refund against the original payment details and ensures it does not exceed the total invoice value.
Useful for customer-initiated cancellations, returns, or support-driven refund requests.
All refund attempts are tracked and reflected in the invoice history and reporting.
curl --request POST \
--url https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund \
--header 'Content-Type: application/json-patch+json' \
--header 'x-revolv3-token: <api-key>' \
--data '
{
"amount": 5,
"includeRawProcessorResponse": false,
"reportGroup": null
}
'import requests
url = "https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund"
payload = {
"amount": 5,
"includeRawProcessorResponse": False,
"reportGroup": None
}
headers = {
"x-revolv3-token": "<api-key>",
"Content-Type": "application/json-patch+json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-revolv3-token': '<api-key>', 'Content-Type': 'application/json-patch+json'},
body: JSON.stringify({amount: 5, includeRawProcessorResponse: false, reportGroup: null})
};
fetch('https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund', 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-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 5,
'includeRawProcessorResponse' => false,
'reportGroup' => null
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json-patch+json",
"x-revolv3-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund"
payload := strings.NewReader("{\n \"amount\": 5,\n \"includeRawProcessorResponse\": false,\n \"reportGroup\": null\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-revolv3-token", "<api-key>")
req.Header.Add("Content-Type", "application/json-patch+json")
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-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund")
.header("x-revolv3-token", "<api-key>")
.header("Content-Type", "application/json-patch+json")
.body("{\n \"amount\": 5,\n \"includeRawProcessorResponse\": false,\n \"reportGroup\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.revolv3.com/api/Invoices/{invoiceId}/refund")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-revolv3-token"] = '<api-key>'
request["Content-Type"] = 'application/json-patch+json'
request.body = "{\n \"amount\": 5,\n \"includeRawProcessorResponse\": false,\n \"reportGroup\": null\n}"
response = http.request(request)
puts response.read_body{
"invoice": {
"invoiceId": 2,
"parentInvoiceId": 1,
"customerId": 1,
"merchantInvoiceRefId": "ca552d9a-637c-49c5-b870-179be6e99e8d",
"paymentMethod": {
"paymentMethodId": 1,
"billingAddressId": 1,
"billingFirstName": "John",
"billingLastName": "Doe",
"merchantPaymentMethodRefId": null,
"billingAddress": {
"addressId": 1,
"addressLine1": "1 Default Street",
"addressLine2": null,
"city": "Los Angeles",
"state": "CA",
"postalCode": "90210",
"phoneNumber": null,
"email": null,
"country": "US"
},
"paymentMethodAchDetails": null,
"paymentMethodCreditCardDetails": null
},
"invoiceStatus": "PartialRefund",
"subtotal": 10.99,
"tax": 0.1,
"total": 11.09,
"billingDate": "30.06.2026",
"merchantLegalName": "John Doe",
"merchantCustomerRefId": "80a0b225-b38e-4971-b475-f36b8fef0457",
"customerFirstName": "John",
"customerLastName": "Doe",
"subscriptionId": null,
"installmentId": null,
"eligibilityFailReason": null,
"merchantSubscriptionRefId": null,
"networkTransactionId": null,
"currency": null,
"invoiceLineItems": null,
"invoiceAttempts": null,
"voidAttempts": null
},
"refunds": [
{
"invoiceAttemptId": 1,
"amount": -3.99,
"invoiceAttemptStatus": "Success",
"invoiceAttemptDate": "2026-07-01T11:31:34.8866527Z",
"paymentProcessor": "BridgePay",
"processorTransactionId": null,
"responseCode": null,
"responseMessage": null,
"processorRawResponse": null,
"paymentMethod": {
"paymentMethodId": 0,
"billingAddressId": 0,
"billingAddress": null,
"billingFirstName": null,
"billingLastName": null,
"merchantPaymentMethodRefId": null,
"paymentMethodAchDetails": null,
"paymentMethodCreditCardDetails": null
},
"descriptor": {
"subMerchantId": null,
"subMerchantName": null,
"subMerchantPhone": null,
"countryCode": null,
"city": null
},
"eligibilityCheckOrderCode": null,
"processorMerchantId": null,
"processingMethod": "None",
"revolv3ResponseCode": null,
"revolv3ResponseMessage": null,
"authCode": null,
"processorResponseDateTime": "2026-07-01T11:31:34.8866527Z"
}
],
"refundedSubtotal": 5.99,
"refundedTax": 0.05,
"refundedTotal": 6.04,
"rawResponse": null,
"message": null,
"responseCode": null,
"responseMessage": null,
"revolv3ResponseCode": null,
"revolv3ResponseMessage": null
}{
"message": "Unable to perform the request action with provided data."
}{
"message": "Attempted to perform an unauthorized operation."
}{
"message": "Unable to find an entity with the provided data."
}{
"message": "Unable to process this operation."
}Authorizations
Path Parameters
1 <= x <= 1000000000Body
0.01 <= x <= 10000000Report Groups could be used to separate your transactions into different categories, so you can view the financial reports by your specific report group names (Worldpay only).
Response
OK
Show child attributes
Show child attributes
Show child attributes
Show child attributes

