curl --request POST \
--url https://allocait.app/api/v1/support-requests \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"subject": "<string>",
"message": "<string>",
"context": {}
}
'import requests
url = "https://allocait.app/api/v1/support-requests"
payload = {
"subject": "<string>",
"message": "<string>",
"context": {}
}
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({subject: '<string>', message: '<string>', context: {}})
};
fetch('https://allocait.app/api/v1/support-requests', 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://allocait.app/api/v1/support-requests",
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([
'subject' => '<string>',
'message' => '<string>',
'context' => [
]
]),
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://allocait.app/api/v1/support-requests"
payload := strings.NewReader("{\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"context\": {}\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://allocait.app/api/v1/support-requests")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"context\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://allocait.app/api/v1/support-requests")
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 \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"context\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"request": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"category": "bug",
"subject": "<string>",
"message": "<string>",
"status": "open",
"source": "app",
"context": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"error": "Portfolio not found or access denied",
"error_code": "NOT_FOUND"
}{
"error": "Portfolio not found or access denied",
"error_code": "NOT_FOUND"
}{
"error": "Portfolio not found or access denied",
"error_code": "NOT_FOUND"
}{
"error": "Portfolio not found or access denied",
"error_code": "NOT_FOUND"
}{
"error": "Internal error",
"error_code": "INTERNAL_ERROR",
"request_id": "5b1e7c52-3f4a-4d0e-9a55-2d5cbe6f0a11"
}File a support request
A bug report, billing question, feature request, or anything else,
the same form the in-app “Contact support” dialog uses. source is
always recorded as agent for requests filed this way, and the
team’s notification carries only the category, the source and the
request id, never the subject or message. Allocait support treats a
request filed this way about the account, billing, deletion, data
export or an email change as unverified, and confirms it with the
account owner (from the account’s email address or in the app)
before acting on it. It never sends account data to an address that
is not on the account.
An account can file 20 support requests per rolling 24 hours, in
the app and through the API combined. Past that, this returns 429
with error_code: DAILY_LIMIT_EXCEEDED.
status reads open until the team picks the request up, then
in_progress, resolved or closed.
Requires the API key to have the write permission.
curl --request POST \
--url https://allocait.app/api/v1/support-requests \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"subject": "<string>",
"message": "<string>",
"context": {}
}
'import requests
url = "https://allocait.app/api/v1/support-requests"
payload = {
"subject": "<string>",
"message": "<string>",
"context": {}
}
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({subject: '<string>', message: '<string>', context: {}})
};
fetch('https://allocait.app/api/v1/support-requests', 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://allocait.app/api/v1/support-requests",
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([
'subject' => '<string>',
'message' => '<string>',
'context' => [
]
]),
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://allocait.app/api/v1/support-requests"
payload := strings.NewReader("{\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"context\": {}\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://allocait.app/api/v1/support-requests")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"context\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://allocait.app/api/v1/support-requests")
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 \"subject\": \"<string>\",\n \"message\": \"<string>\",\n \"context\": {}\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"request": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"category": "bug",
"subject": "<string>",
"message": "<string>",
"status": "open",
"source": "app",
"context": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"error": "Portfolio not found or access denied",
"error_code": "NOT_FOUND"
}{
"error": "Portfolio not found or access denied",
"error_code": "NOT_FOUND"
}{
"error": "Portfolio not found or access denied",
"error_code": "NOT_FOUND"
}{
"error": "Portfolio not found or access denied",
"error_code": "NOT_FOUND"
}{
"error": "Internal error",
"error_code": "INTERNAL_ERROR",
"request_id": "5b1e7c52-3f4a-4d0e-9a55-2d5cbe6f0a11"
}Authorizations
Raw API key shown once when created in the Allocait app (Settings > API keys). Send it verbatim in this header; the server stores and compares only its SHA-256 hash. Allocait generates every key: alc_ followed by 64 lowercase hex characters. Keys issued before 2026-10-10 are 64 hex characters with no prefix and keep working. A key may carry an expiry (90 days or 1 year, or never). A malformed, unknown, revoked or expired key gets 401 with no further detail, and a malformed one is refused before any lookup. Keys cannot be created through this API.
Body
2005000bug, billing, feature_request, other Optional diagnostic context (e.g. which portfolio or page this concerns). At most 2 KB, nested at most 3 levels, with text values of at most 200 characters.