Skip to main content

Deduction Refund API

HTTP Request

POST /v5/bybitpay/agreement/refund

Initiate refund for a successful deduction transaction. Supports full and partial refunds.


Request Parameters

ParameterTypeRequiredDescription
merchant_idstringYesMerchant ID
user_idstringYesPlatform user ID
agreement_typestringYesSign type: CYCLE / NON_CYCLE / SINGLE
trade_nostringEitherPlatform trade number
out_trade_nostringEitherMerchant order number
out_refund_nostringYesMerchant refund number (unique)
refund_amountobjectYesRefund amount
refund_amount.totalstringYesRefund amount (minimum unit)
refund_amount.currencystringYesCurrency code
refund_amount.currency_typestringYesFIAT or CRYPTO
refund_amount.chainstringNoChain network (required for crypto)
refund_reasonstringNoRefund reason
notify_urlstringYesRefund result webhook URL
info

Either trade_no or out_trade_no must be provided.


Response Parameters

ParameterTypeDescription
retCodeintResponse code
retMsgstringResponse message
resultobjectResponse data
result.refund_nostringPlatform refund number
result.out_refund_nostringMerchant refund number
result.trade_nostringOriginal trade number
result.statusstringRefund status: PROCESSING / SUCCESS / FAILED
result.refund_amountobjectRefund amount
result.refund_timestringRefund success time (on success)
result.failure_reasonstringFailure reason (on failure)

Request Example

Full Refund

POST /v5/bybitpay/agreement/refund HTTP/1.1
Host: api2.bybit.com
Content-Type: application/json
X-BAPI-API-KEY: xxxxxxxxxxxxxxxxxx
X-BAPI-TIMESTAMP: 1736233200000
X-BAPI-SIGN: {signature}
X-BAPI-RECV-WINDOW: 5000

{
"merchant_id": "M123456789",
"user_id": "U_123456789",
"agreement_type": "CYCLE",
"trade_no": "PAY202601070001",
"out_refund_no": "REFUND20260107001",
"refund_amount": {
"total": "2350",
"currency": "USDT",
"currency_type": "CRYPTO",
"chain": "TRC20"
},
"refund_reason": "User requested cancellation",
"notify_url": "https://merchant.com/notify/refund"
}

Partial Refund

POST /v5/bybitpay/agreement/refund HTTP/1.1
Host: api2.bybit.com
Content-Type: application/json
X-BAPI-API-KEY: xxxxxxxxxxxxxxxxxx
X-BAPI-TIMESTAMP: 1736233200000
X-BAPI-SIGN: {signature}
X-BAPI-RECV-WINDOW: 5000

{
"merchant_id": "M123456789",
"user_id": "U_123456789",
"agreement_type": "CYCLE",
"out_trade_no": "ORDER20260107001",
"out_refund_no": "REFUND20260107002",
"refund_amount": {
"total": "1000",
"currency": "USDT",
"currency_type": "CRYPTO",
"chain": "TRC20"
},
"refund_reason": "Partial service not provided",
"notify_url": "https://merchant.com/notify/refund"
}

Response Examples

Refund Success

{
"retCode": 20000,
"retMsg": "Success",
"result": {
"refund_no": "RF202601070001",
"out_refund_no": "REFUND20260107001",
"trade_no": "PAY202601070001",
"status": "SUCCESS",
"refund_amount": {
"total": "2350",
"currency": "USDT",
"currency_type": "CRYPTO",
"chain": "TRC20"
},
"refund_time": "2026-01-07T11:30:00Z"
}
}

Refund Processing

{
"retCode": 20000,
"retMsg": "Success",
"result": {
"refund_no": "RF202601070002",
"out_refund_no": "REFUND20260107002",
"trade_no": "PAY202601070001",
"status": "PROCESSING",
"refund_amount": {
"total": "1000",
"currency": "USDT",
"currency_type": "CRYPTO",
"chain": "TRC20"
}
}
}

Refund Failed

{
"retCode": 20000,
"retMsg": "Success",
"result": {
"refund_no": "RF202601070003",
"out_refund_no": "REFUND20260107003",
"trade_no": "PAY202601070001",
"status": "FAILED",
"refund_amount": {
"total": "5000",
"currency": "USDT",
"currency_type": "CRYPTO",
"chain": "TRC20"
},
"failure_reason": "REFUND_AMOUNT_EXCEED"
}
}

Refund Rules

  1. Refundable Amount: Cannot exceed original transaction amount minus already refunded amount
  2. Multiple Refunds: Same transaction supports multiple partial refunds
  3. Quota Restoration: Used agreement quota is restored after successful refund
  4. Agreement State: Refund is allowed even after agreement is unsigned/expired

Error Scenarios

Error CodeDescriptionHandling
REFUND_AMOUNT_EXCEEDRefund amount exceeds refundable amountCheck refunded amount
REFUND_NOT_ALLOWTransaction status does not support refundTransaction must be successful
REFUND_PROCESSINGAnother refund is in progressWait for completion
TRADE_NOT_EXISTOriginal transaction not foundCheck trade number

Notes

  1. Idempotency: Same out_refund_no returns result of first request
  2. Currency Matching: Refund currency must match original transaction currency
  3. Async Processing: PROCESSING status requires waiting for webhook or query
  4. Timeout Handling: Set 30-second timeout, query if timeout occurs