Reverse a payout
Reverse a previously executed payout, crediting the withdrawn amount back to the account.
What happens:
- The payout amount is credited back to the account balance
- High-water mark and daily baseline shift up by the same amount (trailing-drawdown distance preserved)
- Payout count decreases by one
- If the payout reset the consistency cycle, the cycle start shifts accordingly
Requirements:
- The account must be flat (no open positions or working orders)
- The account must be
in_progressornot_started(not passed, failed, or inactive) - The payout must not already be reversed
Idempotency (required): Send an Idempotency-Key header. Replays with the same key return the original result and never credit twice. Use a unique key per reversal attempt; if the response is a 4xx rejection (e.g. OPEN_EXPOSURE), flatten the account and retry with a new key.
Webhooks: account.payout_reversed fires with the reversal details and the credited balances.
Loss floor: Reversing a payout does not restore the pre-payout loss floor. The locked floor only gains cushion.
Error codes:
| Code | Meaning |
|---|---|
OPEN_EXPOSURE | Account has open positions/orders — flatten first |
ACCOUNT_NOT_TRADABLE | Account is passed, failed, expired, or inactive |
PAYOUT_ALREADY_REVERSED | This payout was already reversed |
PAYOUT_NOT_FOUND | Payout ID not found for this account |
REVERSAL_NOT_CONFIRMED | Uncertain outcome — retry with the same idempotency key |
Example:
curl -X POST ".../v1/organization/accounts/7c9e6679.../payouts/e5f6a7b8.../reverse" \
-H "X-API-Key: hp_live_your_key_here" \
-H "Idempotency-Key: reversal-2026-10-10-payout-e5f6" \
-H "Content-Type: application/json" \
-d '{ "reason": "Payout cancelled by trader support" }'
curl --request POST \
--url https://api.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"reason": "Payout cancelled by trader support"
}
'import requests
url = "https://api.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse"
payload = { "reason": "Payout cancelled by trader support" }
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({reason: 'Payout cancelled by trader support'})
};
fetch('https://api.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse', 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.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse",
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([
'reason' => 'Payout cancelled by trader support'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"X-API-Key: <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.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse"
payload := strings.NewReader("{\n \"reason\": \"Payout cancelled by trader support\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/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.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse")
.header("Idempotency-Key", "<idempotency-key>")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"Payout cancelled by trader support\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"Payout cancelled by trader support\"\n}"
response = http.request(request)
puts response.read_body{
"duplicate": true,
"payoutId": "<string>",
"amount": 123,
"balanceBefore": 123,
"balanceAfter": 123,
"reversedAt": "2023-11-07T05:31:56Z"
}Authorizations
Organization API key. Format: "hp_live_{key}". Organization admins manage the key in the dashboard.
Headers
Unique key for this reversal attempt. Replays with the same key never credit twice.
Path Parameters
Trading account ID
Payout ID to reverse
Body
Reason for the reversal (shown in webhooks and audit log)
"Payout cancelled by trader support"
Response
Payout reversed successfully
curl --request POST \
--url https://api.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"reason": "Payout cancelled by trader support"
}
'import requests
url = "https://api.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse"
payload = { "reason": "Payout cancelled by trader support" }
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({reason: 'Payout cancelled by trader support'})
};
fetch('https://api.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse', 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.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse",
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([
'reason' => 'Payout cancelled by trader support'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"X-API-Key: <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.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse"
payload := strings.NewReader("{\n \"reason\": \"Payout cancelled by trader support\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/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.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse")
.header("Idempotency-Key", "<idempotency-key>")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"Payout cancelled by trader support\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/platform/v1/organization/accounts/{accountId}/payouts/{payoutId}/reverse")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"Payout cancelled by trader support\"\n}"
response = http.request(request)
puts response.read_body{
"duplicate": true,
"payoutId": "<string>",
"amount": 123,
"balanceBefore": 123,
"balanceAfter": 123,
"reversedAt": "2023-11-07T05:31:56Z"
}