Create a support ticket
File an incident (something is broken) or a feature request. Urgent-priority tickets are escalated to the Hyperprop team immediately — reserve them for severe issues such as blocked trading or wrong balances.
Attachments must be uploaded first via the uploads endpoint; pass the returned paths here.
Example
curl -X POST "https://api.hyperprop.com/platform/v1/organization/support/tickets" \
-H "X-API-Key: hp_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"type": "incident",
"title": "Fills missing on ES orders",
"description": "Orders filled on the exchange but no fills showed in the terminal.",
"accountIds": ["1e7c9f02-e980-4410-b81f-39599bb6fa47"],
"occurredAt": "2026-08-27T13:45:00Z",
"priority": "high"
}'
Authentication: Accepts either Authorization: Bearer <jwt> (dashboard) or X-API-Key: hp_live_... (programmatic).
curl --request POST \
--url https://api.hyperprop.com/platform/v1/organization/support/tickets \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "incident",
"title": "Fills missing on ES orders since this morning",
"description": "Orders 123/456 filled on the exchange but no fills showed in the terminal…",
"accountIds": [
"<string>"
],
"occurredAt": "<string>",
"priority": "normal",
"attachments": [
{
"path": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp",
"name": "screenshot.webp",
"size": 482133,
"contentType": "image/webp"
}
]
}
'import requests
url = "https://api.hyperprop.com/platform/v1/organization/support/tickets"
payload = {
"type": "incident",
"title": "Fills missing on ES orders since this morning",
"description": "Orders 123/456 filled on the exchange but no fills showed in the terminal…",
"accountIds": ["<string>"],
"occurredAt": "<string>",
"priority": "normal",
"attachments": [
{
"path": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp",
"name": "screenshot.webp",
"size": 482133,
"contentType": "image/webp"
}
]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'incident',
title: 'Fills missing on ES orders since this morning',
description: 'Orders 123/456 filled on the exchange but no fills showed in the terminal…',
accountIds: ['<string>'],
occurredAt: '<string>',
priority: 'normal',
attachments: [
{
path: 'a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp',
name: 'screenshot.webp',
size: 482133,
contentType: 'image/webp'
}
]
})
};
fetch('https://api.hyperprop.com/platform/v1/organization/support/tickets', 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/support/tickets",
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([
'type' => 'incident',
'title' => 'Fills missing on ES orders since this morning',
'description' => 'Orders 123/456 filled on the exchange but no fills showed in the terminal…',
'accountIds' => [
'<string>'
],
'occurredAt' => '<string>',
'priority' => 'normal',
'attachments' => [
[
'path' => 'a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp',
'name' => 'screenshot.webp',
'size' => 482133,
'contentType' => 'image/webp'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$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/support/tickets"
payload := strings.NewReader("{\n \"type\": \"incident\",\n \"title\": \"Fills missing on ES orders since this morning\",\n \"description\": \"Orders 123/456 filled on the exchange but no fills showed in the terminal…\",\n \"accountIds\": [\n \"<string>\"\n ],\n \"occurredAt\": \"<string>\",\n \"priority\": \"normal\",\n \"attachments\": [\n {\n \"path\": \"a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp\",\n \"name\": \"screenshot.webp\",\n \"size\": 482133,\n \"contentType\": \"image/webp\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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/support/tickets")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"incident\",\n \"title\": \"Fills missing on ES orders since this morning\",\n \"description\": \"Orders 123/456 filled on the exchange but no fills showed in the terminal…\",\n \"accountIds\": [\n \"<string>\"\n ],\n \"occurredAt\": \"<string>\",\n \"priority\": \"normal\",\n \"attachments\": [\n {\n \"path\": \"a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp\",\n \"name\": \"screenshot.webp\",\n \"size\": 482133,\n \"contentType\": \"image/webp\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/platform/v1/organization/support/tickets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"incident\",\n \"title\": \"Fills missing on ES orders since this morning\",\n \"description\": \"Orders 123/456 filled on the exchange but no fills showed in the terminal…\",\n \"accountIds\": [\n \"<string>\"\n ],\n \"occurredAt\": \"<string>\",\n \"priority\": \"normal\",\n \"attachments\": [\n {\n \"path\": \"a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp\",\n \"name\": \"screenshot.webp\",\n \"size\": 482133,\n \"contentType\": \"image/webp\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"ticket": {
"id": "e4b1a2c3-d4e5-4f60-8192-a3b4c5d6e7f8",
"ticketNumber": 42,
"organizationId": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34",
"createdByUserId": "0b1c2d3e-4f50-6172-8394-a5b6c7d8e9f0",
"createdByEmail": "ops@yourfirm.com",
"createdByName": "Your Firm LLC",
"type": "incident",
"title": "Fills missing on ES orders since this morning",
"description": "Orders 123/456 filled on the exchange but no fills showed…",
"accountIds": [
"1e7c9f02-e980-4410-b81f-39599bb6fa47"
],
"occurredAt": "2026-08-27T13:45:00.000Z",
"priority": "high",
"status": "open",
"attachments": [
{
"path": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp",
"name": "screenshot.webp",
"size": 482133,
"contentType": "image/webp",
"signedUrl": "<string>"
}
],
"comments": [
{
"id": "7d5c2f4e-9a1b-4c3d-8e2f-6a5b4c3d2e1f",
"authorType": "hyperprop",
"authorId": "<string>",
"authorName": "ops@yourfirm.com",
"body": "We shipped a fix — can you confirm it looks right now?",
"attachments": [
{
"path": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp",
"name": "screenshot.webp",
"size": 482133,
"contentType": "image/webp",
"signedUrl": "<string>"
}
],
"createdAt": "2026-08-27T16:21:00.000Z"
}
],
"commentCount": 2,
"createdAt": "<string>",
"updatedAt": "<string>"
}
}
}{
"statusCode": 401,
"error": "Unauthorized",
"message": "Invalid or expired token",
"code": "UNAUTHORIZED"
}{
"statusCode": 500,
"error": "Internal Server Error",
"message": "Failed to load tickets",
"code": "SUPPORT_ERROR"
}Authorizations
JWT Bearer token for user session auth. Format: "Bearer {token}". Used by User and Organization endpoints.
Body
incident, feature_request "incident"
1 - 200"Fills missing on ES orders since this morning"
1 - 20000"Orders 123/456 filled on the exchange but no fills showed in the terminal…"
Affected trading account ids (incidents)
5064When the issue happened (ISO 8601)
low, normal, high, urgent 5Show child attributes
Show child attributes
Related topics
Reply on a support ticketList your support ticketsGet a support ticket with its reply threadGet signed upload URLs for ticket attachmentsChangelogcurl --request POST \
--url https://api.hyperprop.com/platform/v1/organization/support/tickets \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "incident",
"title": "Fills missing on ES orders since this morning",
"description": "Orders 123/456 filled on the exchange but no fills showed in the terminal…",
"accountIds": [
"<string>"
],
"occurredAt": "<string>",
"priority": "normal",
"attachments": [
{
"path": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp",
"name": "screenshot.webp",
"size": 482133,
"contentType": "image/webp"
}
]
}
'import requests
url = "https://api.hyperprop.com/platform/v1/organization/support/tickets"
payload = {
"type": "incident",
"title": "Fills missing on ES orders since this morning",
"description": "Orders 123/456 filled on the exchange but no fills showed in the terminal…",
"accountIds": ["<string>"],
"occurredAt": "<string>",
"priority": "normal",
"attachments": [
{
"path": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp",
"name": "screenshot.webp",
"size": 482133,
"contentType": "image/webp"
}
]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'incident',
title: 'Fills missing on ES orders since this morning',
description: 'Orders 123/456 filled on the exchange but no fills showed in the terminal…',
accountIds: ['<string>'],
occurredAt: '<string>',
priority: 'normal',
attachments: [
{
path: 'a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp',
name: 'screenshot.webp',
size: 482133,
contentType: 'image/webp'
}
]
})
};
fetch('https://api.hyperprop.com/platform/v1/organization/support/tickets', 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/support/tickets",
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([
'type' => 'incident',
'title' => 'Fills missing on ES orders since this morning',
'description' => 'Orders 123/456 filled on the exchange but no fills showed in the terminal…',
'accountIds' => [
'<string>'
],
'occurredAt' => '<string>',
'priority' => 'normal',
'attachments' => [
[
'path' => 'a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp',
'name' => 'screenshot.webp',
'size' => 482133,
'contentType' => 'image/webp'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$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/support/tickets"
payload := strings.NewReader("{\n \"type\": \"incident\",\n \"title\": \"Fills missing on ES orders since this morning\",\n \"description\": \"Orders 123/456 filled on the exchange but no fills showed in the terminal…\",\n \"accountIds\": [\n \"<string>\"\n ],\n \"occurredAt\": \"<string>\",\n \"priority\": \"normal\",\n \"attachments\": [\n {\n \"path\": \"a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp\",\n \"name\": \"screenshot.webp\",\n \"size\": 482133,\n \"contentType\": \"image/webp\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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/support/tickets")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"incident\",\n \"title\": \"Fills missing on ES orders since this morning\",\n \"description\": \"Orders 123/456 filled on the exchange but no fills showed in the terminal…\",\n \"accountIds\": [\n \"<string>\"\n ],\n \"occurredAt\": \"<string>\",\n \"priority\": \"normal\",\n \"attachments\": [\n {\n \"path\": \"a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp\",\n \"name\": \"screenshot.webp\",\n \"size\": 482133,\n \"contentType\": \"image/webp\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/platform/v1/organization/support/tickets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"incident\",\n \"title\": \"Fills missing on ES orders since this morning\",\n \"description\": \"Orders 123/456 filled on the exchange but no fills showed in the terminal…\",\n \"accountIds\": [\n \"<string>\"\n ],\n \"occurredAt\": \"<string>\",\n \"priority\": \"normal\",\n \"attachments\": [\n {\n \"path\": \"a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp\",\n \"name\": \"screenshot.webp\",\n \"size\": 482133,\n \"contentType\": \"image/webp\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"ticket": {
"id": "e4b1a2c3-d4e5-4f60-8192-a3b4c5d6e7f8",
"ticketNumber": 42,
"organizationId": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34",
"createdByUserId": "0b1c2d3e-4f50-6172-8394-a5b6c7d8e9f0",
"createdByEmail": "ops@yourfirm.com",
"createdByName": "Your Firm LLC",
"type": "incident",
"title": "Fills missing on ES orders since this morning",
"description": "Orders 123/456 filled on the exchange but no fills showed…",
"accountIds": [
"1e7c9f02-e980-4410-b81f-39599bb6fa47"
],
"occurredAt": "2026-08-27T13:45:00.000Z",
"priority": "high",
"status": "open",
"attachments": [
{
"path": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp",
"name": "screenshot.webp",
"size": 482133,
"contentType": "image/webp",
"signedUrl": "<string>"
}
],
"comments": [
{
"id": "7d5c2f4e-9a1b-4c3d-8e2f-6a5b4c3d2e1f",
"authorType": "hyperprop",
"authorId": "<string>",
"authorName": "ops@yourfirm.com",
"body": "We shipped a fix — can you confirm it looks right now?",
"attachments": [
{
"path": "a6fcc0ce-eb28-4f43-b256-96a3144b0d34/1f2e.../screenshot.webp",
"name": "screenshot.webp",
"size": 482133,
"contentType": "image/webp",
"signedUrl": "<string>"
}
],
"createdAt": "2026-08-27T16:21:00.000Z"
}
],
"commentCount": 2,
"createdAt": "<string>",
"updatedAt": "<string>"
}
}
}{
"statusCode": 401,
"error": "Unauthorized",
"message": "Invalid or expired token",
"code": "UNAUTHORIZED"
}{
"statusCode": 500,
"error": "Internal Server Error",
"message": "Failed to load tickets",
"code": "SUPPORT_ERROR"
}