Create a Refund
Issue a full or partial refund for a successful charge. Funds are automatically returned to the customer's original payment method.
API Credentials
Request Parametersโ
Required - 1 fieldRequired Parameters
`id`STRING(required)
Charge ID to refund (path parameter). The charge must be successful, captured, and refundable.
Recommended - 1 fieldRecommended Parameters
Additional - 2 fieldsAdditional Parameters
Responsesโ
200
Successful refundRefund created successfully. Check the status field to determine processing state.
Possible refund statuses:
pending- Refund being processed. Customers typically see funds in 5-10 business days.successful- Refund completed successfully.failed- Refund failed (rare).
400
Bad requestRequest validation failed. Check the error message for details.
Common causes:
- Invalid charge ID format
- Amount exceeds refundable balance
- Invalid metadata format
- Amount below minimum (1 unit)
401
UnauthorizedAuthentication failed. Invalid or missing API key.
Common causes:
- Missing Authorization header
- Invalid secret key
- Using public key instead of secret key
- Incorrect HTTP Basic Auth format
404
Not foundCharge not found.
Common causes:
- Incorrect charge ID
- Charge belongs to different account
- Charge ID typo or formatting error
422
Unprocessable entityCharge cannot be refunded.
Common causes:
- Charge not successful (still pending or failed)
- Charge already fully refunded
- Refund amount exceeds available balance
- Charge has 15 or more partial refunds (maximum limit)
- Charge older than 365 days (or shorter for some payment methods)
Code samplesโ
- cURL
- Ruby
- Python
- Node.js
- PHP
- Java
- C#
- Go
curl https://api.omise.co/charges/chrg_test_5xuy4w91xqz7d1w9u0t/refunds \
-X POST \
-u skey_test_5xuy4w91xqz7d1w9u0t: \
-d "amount=50000"
require 'omise'
Omise.api_key = 'skey_test_5xuy4w91xqz7d1w9u0t'
refund = Omise::Charge.refund('chrg_test_5xuy4w91xqz7d1w9u0t', {
amount: 50000
})
import omise
omise.api_secret = 'skey_test_5xuy4w91xqz7d1w9u0t'
refund = omise.Charge.refund('chrg_test_5xuy4w91xqz7d1w9u0t',
amount=50000
)
const omise = require('omise')({
secretKey: 'skey_test_5xuy4w91xqz7d1w9u0t'
});
const refund = await omise.charges.refund('chrg_test_5xuy4w91xqz7d1w9u0t', {
amount: 50000
});
<?php
define('OMISE_SECRET_KEY', 'skey_test_5xuy4w91xqz7d1w9u0t');
$charge = OmiseCharge::retrieve('chrg_test_5xuy4w91xqz7d1w9u0t');
$refund = $charge->refund([
'amount' => 50000
]);
Client client = new Client.Builder()
.secretKey("skey_test_5xuy4w91xqz7d1w9u0t")
.build();
Refund refund = client.charges().refund("chrg_test_5xuy4w91xqz7d1w9u0t")
.amount(50000L)
.send();
var client = new Client("skey_test_5xuy4w91xqz7d1w9u0t");
var refund = await client.Charges.Refund("chrg_test_5xuy4w91xqz7d1w9u0t", new CreateRefundRequest
{
Amount = 50000
});
client, _ := omise.NewClient(
"pkey_test_5xuy4w91xqz7d1w9u0t",
"skey_test_5xuy4w91xqz7d1w9u0t",
)
refund, _ := client.CreateRefund(&operations.CreateRefund{
ChargeID: "chrg_test_5xuy4w91xqz7d1w9u0t",
Amount: 50000,
})
Error and result codesโ
Common Error Codesโ
| Code | Description | Resolution |
|---|---|---|
bad_request | Missing or invalid parameters | Check all required fields are provided |
authentication_failure | Invalid API key | Verify your secret key is correct |
not_found | Charge ID does not exist | Check charge ID is correct |
charge_not_refundable | Charge cannot be refunded | Verify charge status is successful |
insufficient_refundable_amount | Amount exceeds available balance | Check charge.amount - charge.refunded_amount |
too_many_refunds | 15 refunds already created | Maximum 15 partial refunds per charge |
refund_period_expired | Charge older than refund window | Charges must be under 365 days old |
Refund Status Codesโ
| Status | Description |
|---|---|
pending | Refund being processed |
successful | Refund completed successfully |
failed | Refund failed (rare) |
Try it outโ
Required - 1 fields
Recommended - 1 fields
Additional - 2 fields