Void a transaction
Reverse an earn you committed — a refunded sale, a mis-scan, a wrong amount. The customer's points and stamps are clawed back with compensating ledger entries; nothing is deleted.
Scope required: transactions.write.
curl -X POST "https://staging.app.rewards.network/api/partner/v1/transactions/9901/void" \
-H "Authorization: Bearer rn_live_..." \
-H "Content-Type: application/json" \
-d '{ "reason": "Refund #R-2291" }'
transactionId is data.transaction.id from the commit response (or txn_id in the history feed). reason is optional, max 255 characters, stored for the merchant's records.
{
"success": true,
"message": "Transaction voided successfully",
"data": {
"transaction": { "id": 9901, "transaction_type": "earn", "voided_at": "2026-09-22T12:03:44.000000Z", "void_reason": "Refund #R-2291", "...": "..." },
"reversal": { "id": 9915, "transaction_type": "void", "reverses_txn_id": 9901, "points_delta": -43, "stamps_delta": -1, "...": "..." },
"points_reversed": 43,
"stamps_reversed": 1
},
"is_duplicate": false
}
Rules
| Rule | Otherwise |
|---|---|
Only earn transactions (transaction_type: earn). Redemptions cannot be voided. |
422 |
| Only transactions committed through your own developer account's keys. | 403 |
| Only within 72 hours of the commit. | 422 |
| Only while the customer still holds the earned points/stamps. If they already spent some, the void is refused rather than driving the balance negative. | 409 |
| The transaction must belong to the key's merchant. | 404 |
Voiding twice is safe: the second call returns the original result with "is_duplicate": true.
What is reversed
- Points and stamps from the original earn, as negative
VOIDledger entries. - The customer's visit count and total spending at the merchant.
- Nothing about a voucher or reward that was redeemed on the same sale — a completed redemption stays completed.
Webhook
Fires transaction.voided with transaction_id, reversal_transaction_id, points_reversed, stamps_reversed. Webhooks.
Reward Networks