Reverse a charge
Reverse a pre-authorized charge to release the hold on customer funds without capturing payment. Only works for charges created with capture=false.
API Credentials
Request Parametersโ
Required - 1 fieldRequired Parameters
`id`STRING(required)
The charge ID to reverse. Must be an uncaptured pre-authorized charge (status: successful, capture: false, reversible: true).
Responsesโ
200
Successfully reversedPre-authorization cancelled. Funds released back to customer.
Key field changes after reversal:
status- Changes from successful to reversedreversed- Changes from false to truereversed_at- Set to current timestampreversible- Changes from true to falsecapturable- Changes from true to false
400
Bad requestInvalid parameters or charge cannot be reversed.
Common causes:
- Charge already captured (use refund instead)
- Invalid charge ID format
- Charge not a pre-authorization
401
UnauthorizedAuthentication failed. Invalid or missing API key.
Common causes:
- Missing Authorization header
- Invalid secret key
- Using public key instead of secret key
404
Not foundCharge ID does not exist.
Common causes:
- Incorrect charge ID
- Charge from different account
- Using test key for live charge (or vice versa)
422
Unprocessable entityCharge cannot be reversed.
Common causes:
- Charge already reversed
- Charge already captured (cannot reverse captured charges)
- Charge not reversible (expired or wrong status)
- Authorization expired (beyond 7-day window)
Code samplesโ
- cURL
- Ruby
- Python
- Node.js
- PHP
- Java
- C#
- Go
curl https://api.omise.co/charges/chrg_test_5xuy4w91xqz7d1w9u0t/reverse \
-X POST \
-u skey_test_5xuy4w91xqz7d1w9u0t:
require 'omise'
Omise.api_key = 'skey_test_5xuy4w91xqz7d1w9u0t'
charge = Omise::Charge.reverse('chrg_test_5xuy4w91xqz7d1w9u0t')
import omise
omise.api_secret = 'skey_test_5xuy4w91xqz7d1w9u0t'
charge = omise.Charge.reverse('chrg_test_5xuy4w91xqz7d1w9u0t')
const omise = require('omise')({
secretKey: 'skey_test_5xuy4w91xqz7d1w9u0t'
});
const charge = await omise.charges.reverse('chrg_test_5xuy4w91xqz7d1w9u0t');
<?php
define('OMISE_SECRET_KEY', 'skey_test_5xuy4w91xqz7d1w9u0t');
$charge = OmiseCharge::retrieve('chrg_test_5xuy4w91xqz7d1w9u0t');
$charge->reverse();
Client client = new Client.Builder()
.secretKey("skey_test_5xuy4w91xqz7d1w9u0t")
.build();
Charge charge = client.charges().reverse("chrg_test_5xuy4w91xqz7d1w9u0t")
.send();
var client = new Client("skey_test_5xuy4w91xqz7d1w9u0t");
var charge = await client.Charges.Reverse("chrg_test_5xuy4w91xqz7d1w9u0t");
client, _ := omise.NewClient(
"pkey_test_5xuy4w91xqz7d1w9u0t",
"skey_test_5xuy4w91xqz7d1w9u0t",
)
charge, _ := client.ReverseCharge("chrg_test_5xuy4w91xqz7d1w9u0t", nil)
Error and result codesโ
Common Error Codesโ
| Code | Description | Resolution |
|---|---|---|
not_found | Charge ID doesn't exist | Verify charge ID is correct |
already_reversed | Charge already reversed | No action needed |
already_captured | Charge captured (use refund) | Cannot reverse captured charges |
not_reversible | Charge cannot be reversed | Check reversible field is true |
authorization_expired | Pre-auth expired (>7 days) | Cannot reverse expired auth |
Reversal Requirementsโ
| Field | Required Value | Description |
|---|---|---|
status | successful | Must be authorized |
capture | false | Must be pre-auth |
reversible | true | Must be eligible for reversal |
reversed | false | Not already reversed |
| Age | < 7 days | Within authorization window |
Try it outโ
Required - 1 fields