Release a stuck idempotency key
Frees an Idempotency-Key whose request never finished, so you can send the request again with the same key instead of waiting 24 hours for it to expire.
A key is stuck when a retry returns 409 IDEMPOTENCY_KEY_IN_PROGRESS with stale: true, or when GET /organization/idempotency-keys shows in_progress with stale: true. That happens when a request stops before a response is recorded, for example during a service disruption.
Check before you retry. A stuck request may still have taken effect before it stopped. Confirm the result directly (for example list the trader’s accounts, or look up the account you were updating) before sending the request again.
Only an in-progress key that has been in progress for more than 120 seconds can be released:
- A completed key is never released (
409 IDEMPOTENCY_KEY_COMPLETED, with its storedresponse): the request took effect, and a retry with the key returns that response. - A key in progress for less than 120 seconds may still be running (
409 IDEMPOTENCY_KEY_NOT_STALE, withreleasableAt). - A key with nothing on record returns
404 IDEMPOTENCY_KEY_NOT_FOUND: it is already free to use.
Release a key with the same API key (or the same signed-in member) that sent the request, and give the same method and path. Requires the permission the original endpoint needs.
curl -X POST "https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release" \
-H "X-API-Key: hp_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"key": "acme-order-20058745", "method": "POST", "path": "/platform/v1/organization/trading-accounts"}'
curl --request POST \
--url https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"key": "acme-order-20058745",
"path": "/platform/v1/organization/trading-accounts",
"method": "POST"
}
'import requests
url = "https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release"
payload = {
"key": "acme-order-20058745",
"path": "/platform/v1/organization/trading-accounts",
"method": "POST"
}
headers = {
"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: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
key: 'acme-order-20058745',
path: '/platform/v1/organization/trading-accounts',
method: 'POST'
})
};
fetch('https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release', 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/idempotency-keys/release",
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([
'key' => 'acme-order-20058745',
'path' => '/platform/v1/organization/trading-accounts',
'method' => 'POST'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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/idempotency-keys/release"
payload := strings.NewReader("{\n \"key\": \"acme-order-20058745\",\n \"path\": \"/platform/v1/organization/trading-accounts\",\n \"method\": \"POST\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/idempotency-keys/release")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"key\": \"acme-order-20058745\",\n \"path\": \"/platform/v1/organization/trading-accounts\",\n \"method\": \"POST\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"key\": \"acme-order-20058745\",\n \"path\": \"/platform/v1/organization/trading-accounts\",\n \"method\": \"POST\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"released": true,
"key": "acme-order-20058745",
"method": "POST",
"path": "/platform/v1/organization/trading-accounts",
"startedAt": "2026-10-21T13:37:10.000Z"
}
}{
"success": false,
"statusCode": 400,
"error": "Bad Request",
"message": "`path` must be the organization endpoint the key was sent to, for example /platform/v1/organization/trading-accounts",
"code": "INVALID_PATH"
}{
"success": false,
"statusCode": 401,
"error": "Unauthorized",
"message": "Authentication required",
"code": "UNAUTHORIZED"
}{
"success": false,
"statusCode": 403,
"error": "Forbidden",
"message": "Your role does not have write access to \"Traders & accounts\"",
"code": "INSUFFICIENT_PERMISSIONS"
}{
"success": false,
"statusCode": 404,
"error": "Not Found",
"message": "No request with this Idempotency-Key is on record for this endpoint; you can send the request with it",
"code": "IDEMPOTENCY_KEY_NOT_FOUND"
}{
"success": false,
"statusCode": 409,
"error": "Conflict",
"message": "The earlier request with this Idempotency-Key may still be running. It can be released from `releasableAt`.",
"code": "IDEMPOTENCY_KEY_NOT_STALE",
"startedAt": "2026-10-21T13:37:10.000Z",
"releasableAt": "2026-10-21T13:39:10.000Z",
"response": {
"statusCode": 201,
"body": "<string>"
}
}{
"success": false,
"statusCode": 500,
"error": "Internal Server Error",
"message": "An unexpected error occurred",
"code": "INTERNAL_ERROR"
}Authorizations
Organization API key. Format: "hp_live_{key}". Organization admins manage the key in the dashboard.
Body
The Idempotency-Key value you sent
1 - 255"acme-order-20058745"
Path of the original request, as sent (/platform/v1/organization/...; a path starting at /v1/ also works). No query string.
1 - 500"/platform/v1/organization/trading-accounts"
HTTP method of the original request
POST, PUT, PATCH, DELETE "POST"
curl --request POST \
--url https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"key": "acme-order-20058745",
"path": "/platform/v1/organization/trading-accounts",
"method": "POST"
}
'import requests
url = "https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release"
payload = {
"key": "acme-order-20058745",
"path": "/platform/v1/organization/trading-accounts",
"method": "POST"
}
headers = {
"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: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
key: 'acme-order-20058745',
path: '/platform/v1/organization/trading-accounts',
method: 'POST'
})
};
fetch('https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release', 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/idempotency-keys/release",
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([
'key' => 'acme-order-20058745',
'path' => '/platform/v1/organization/trading-accounts',
'method' => 'POST'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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/idempotency-keys/release"
payload := strings.NewReader("{\n \"key\": \"acme-order-20058745\",\n \"path\": \"/platform/v1/organization/trading-accounts\",\n \"method\": \"POST\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/idempotency-keys/release")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"key\": \"acme-order-20058745\",\n \"path\": \"/platform/v1/organization/trading-accounts\",\n \"method\": \"POST\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/platform/v1/organization/idempotency-keys/release")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"key\": \"acme-order-20058745\",\n \"path\": \"/platform/v1/organization/trading-accounts\",\n \"method\": \"POST\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"released": true,
"key": "acme-order-20058745",
"method": "POST",
"path": "/platform/v1/organization/trading-accounts",
"startedAt": "2026-10-21T13:37:10.000Z"
}
}{
"success": false,
"statusCode": 400,
"error": "Bad Request",
"message": "`path` must be the organization endpoint the key was sent to, for example /platform/v1/organization/trading-accounts",
"code": "INVALID_PATH"
}{
"success": false,
"statusCode": 401,
"error": "Unauthorized",
"message": "Authentication required",
"code": "UNAUTHORIZED"
}{
"success": false,
"statusCode": 403,
"error": "Forbidden",
"message": "Your role does not have write access to \"Traders & accounts\"",
"code": "INSUFFICIENT_PERMISSIONS"
}{
"success": false,
"statusCode": 404,
"error": "Not Found",
"message": "No request with this Idempotency-Key is on record for this endpoint; you can send the request with it",
"code": "IDEMPOTENCY_KEY_NOT_FOUND"
}{
"success": false,
"statusCode": 409,
"error": "Conflict",
"message": "The earlier request with this Idempotency-Key may still be running. It can be released from `releasableAt`.",
"code": "IDEMPOTENCY_KEY_NOT_STALE",
"startedAt": "2026-10-21T13:37:10.000Z",
"releasableAt": "2026-10-21T13:39:10.000Z",
"response": {
"statusCode": 201,
"body": "<string>"
}
}{
"success": false,
"statusCode": 500,
"error": "Internal Server Error",
"message": "An unexpected error occurred",
"code": "INTERNAL_ERROR"
}