API reference
Platform administration
/ v1/ platform/ analyticsTraffic across every customer deployment, with the busiest organizations.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:analytics in the platform organisation
Query parameters
range"24h" | "7d" | "30d" | "90d"Default
"24h".appany
curl 'https://api.cactive.com.au/v1/platform/analytics' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
top: {
hosts?: {
key: string
requests: number
bytes: number
name?: string
}[]
deployments?: {
key: string
requests: number
bytes: number
name?: string
}[]
paths?: {
key: string
requests: number
bytes: number
name?: string
}[]
orgs?: {
key: string
requests: number
bytes: number
name?: string
}[]
countries?: {
key: string
requests: number
bytes: number
name?: string
}[]
projects?: {
key: string
requests: number
bytes: number
name?: string
}[]
}
unattributed: number
updatedAt: null | number
range: "24h" | "7d" | "30d" | "90d"
step: number
from: string
to: string
totals: {
bytes: number
requests: number
s2xx: number
s3xx: number
s4xx: number
s5xx: number
hits: number
misses: number
p50: null | number
p95: null | number
}
series: {
bytes: number
requests: number
s2xx: number
s3xx: number
s4xx: number
s5xx: number
hits: number
misses: number
p50: null | number
p95: null | number
t: string
}[]
}/ v1/ platform/ mail/ usageMail sent and received per organization over the last days.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:analytics in the platform organisation
Query parameters
daysintegerDefault
7. 1–31. Coerced from a string.
curl 'https://api.cactive.com.au/v1/platform/mail/usage' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
days: number
total: {
sent: number
received: number
bounced: number
complained: number
}
orgs: {
orgId: string
sent: number
received: number
bounced: number
complained: number
}[]
}/ v1/ platform/ usageCost per organization for a month (month=YYYY-MM, default this month) from Cost Explorer, grouped by the si:org cost allocation tag, with each organization's Serverless App Services, repositories, databases and buckets, deployment requests and bytes, and mail sent and received in the month. Spend without the tag is untagged.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Query parameters
monthstringMatches
^\d{4}-(0[1-9]|1[0-2])$.
curl 'https://api.cactive.com.au/v1/platform/usage' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
month: string
currency: string
estimated: boolean
costError?: string
orgs: {
projects: number
repositories: number
databases: number
buckets: number
requests: null | number
bytes: null | number
mailSent: null | number
mailReceived: null | number
orgId: string
name: string
slug: string
kind: "platform" | "customer"
planId?: string
cost: null | number
}[]
untagged: null | number
otherOrgs: null | number
}/ v1/ platform/ coverage/ runsRecords a test coverage run of the platform's repository: its commit, branch, pipeline run and each workspace's tests, line, branch and function coverage, least covered and untested files. Totals are worked out from the workspaces. Kept 90 days. Needs platform:coverage (the nightly pipeline's key).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:coverage in the platform organisation
Request body
version1requiredcommitstringMatches
^[0-9a-f]{7,64}$.branchstring1–255 characters.
runUrlstringUp to 2,000 characters. URL.
source"ci" | "local"requiredstartedAtintegerrequired> 0.
finishedAtintegerrequired> 0.
packagesobject[]required1–300 items.
packages[].namestringrequired1–214 characters.
packages[].dirstringrequiredUp to 200 characters. Matches
^[A-Za-z0-9][A-Za-z0-9._-]*(\/[A-Za-z0-9._-]+)*$.packages[].status"passed" | "failed" | "error"requiredpackages[].testsobjectrequiredpackages[].tests.totalintegerrequired0–100000000.
packages[].tests.passedintegerrequired0–100000000.
packages[].tests.failedintegerrequired0–100000000.
packages[].tests.skippedintegerrequired0–100000000.
packages[].tests.todointegerrequired0–100000000.
packages[].tests.cancelledintegerrequired0–100000000.
packages[].durationMsintegerrequired0–100000000.
packages[].linesobjectrequiredpackages[].lines.totalintegerrequired0–100000000.
packages[].lines.coveredintegerrequired0–100000000.
packages[].branchesobjectrequiredpackages[].branches.totalintegerrequired0–100000000.
packages[].branches.coveredintegerrequired0–100000000.
packages[].functionsobjectrequiredpackages[].functions.totalintegerrequired0–100000000.
packages[].functions.coveredintegerrequired0–100000000.
packages[].filesobjectrequiredpackages[].files.loadedintegerrequired0–100000000.
packages[].files.sourceintegerrequired0–100000000.
packages[].leastCoveredobject[]requiredUp to 25 items.
packages[].leastCovered[].pathstringrequired1–500 characters.
packages[].leastCovered[].linesobjectrequiredpackages[].leastCovered[].lines.totalintegerrequired0–100000000.
packages[].leastCovered[].lines.coveredintegerrequired0–100000000.
packages[].leastCovered[].branchesobjectrequiredpackages[].leastCovered[].branches.totalintegerrequired0–100000000.
packages[].leastCovered[].branches.coveredintegerrequired0–100000000.
packages[].leastCovered[].functionsobjectrequiredpackages[].leastCovered[].functions.totalintegerrequired0–100000000.
packages[].leastCovered[].functions.coveredintegerrequired0–100000000.
packages[].untestedstring[]requiredUp to 50 items. Each 1–500 characters.
packages[].errorstringUp to 2,000 characters.
packages[].cachedbooleantotalsany JSON
Errors
503The table is busy; try again.
curl -X POST 'https://api.cactive.com.au/v1/platform/coverage/runs' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1,
"source": "ci",
"startedAt": 1,
"finishedAt": 1,
"packages": [
{
"name": "Example",
"dir": "example",
"status": "passed",
"tests": {
"total": 1,
"passed": 1,
"failed": 1,
"skipped": 1,
"todo": 1,
"cancelled": 1
},
"durationMs": 1,
"lines": {
"total": 1,
"covered": 1
},
"branches": {
"total": 1,
"covered": 1
},
"functions": {
"total": 1,
"covered": 1
},
"files": {
"loaded": 1,
"source": 1
},
"leastCovered": [
{
"path": "example",
"lines": {
"total": 1,
"covered": 1
},
"branches": {
"total": 1,
"covered": 1
},
"functions": {
"total": 1,
"covered": 1
}
}
],
"untested": [
"example"
]
}
]
}'Response 201
{
runId: string
}/ v1/ platform/ coverage/ latestThe latest coverage run's id, commit and start, so a pipeline can skip a commit it already reported. Needs platform:coverage or platform:admin.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scopes
- platform:coverage (for the pipeline's key), platform:admin (for Admin)
Errors
403Missing scope …
curl 'https://api.cactive.com.au/v1/platform/coverage/latest' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
run: null | {
runId: string
commit: null | string
startedAt: number
}
}/ v1/ platform/ coverageCoverage runs of the last 90 days (newest first) with their totals, a run's workspaces (run=, default the latest) and the workspaces of the run before it, for changes.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Query parameters
runstringUp to 64 characters.
Errors
404No such run
curl 'https://api.cactive.com.au/v1/platform/coverage' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
runs: {
branch?: string
source: "local" | "ci"
startedAt: number
commit?: string
finishedAt: number
totals: {
lines: {
total: number
covered: number
}
branches: {
total: number
covered: number
}
functions: {
total: number
covered: number
}
tests: {
total: number
passed: number
failed: number
skipped: number
todo: number
cancelled: number
}
durationMs: number
packages: number
failedPackages: number
}
runUrl?: string
runId: string
}[]
run: null | {
branch?: string
source: "local" | "ci"
startedAt: number
commit?: string
finishedAt: number
totals: {
lines: {
total: number
covered: number
}
branches: {
total: number
covered: number
}
functions: {
total: number
covered: number
}
tests: {
total: number
passed: number
failed: number
skipped: number
todo: number
cancelled: number
}
durationMs: number
packages: number
failedPackages: number
}
runUrl?: string
runId: string
}
packages: {
error?: string
name: string
status: "error" | "failed" | "passed"
durationMs: number
dir: string
files: {
loaded: number
source: number
}
lines: {
total: number
covered: number
}
tests: {
total: number
passed: number
failed: number
skipped: number
todo: number
cancelled: number
}
cached?: boolean
branches: {
total: number
covered: number
}
functions: {
total: number
covered: number
}
}[]
previous: null | {
runId: string
packages: {
error?: string
name: string
status: "error" | "failed" | "passed"
durationMs: number
dir: string
files: {
loaded: number
source: number
}
lines: {
total: number
covered: number
}
tests: {
total: number
passed: number
failed: number
skipped: number
todo: number
cancelled: number
}
cached?: boolean
branches: {
total: number
covered: number
}
functions: {
total: number
covered: number
}
}[]
}
}/ v1/ platform/ coverage/ runs/ :runId/ packageOne workspace of a coverage run (dir=services/api) with its least covered loaded files and the source files no test loaded.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
runIdCoverage run id (
cov_…).
Query parameters
dirany JSONrequired
Errors
404No such workspace in this run
curl 'https://api.cactive.com.au/v1/platform/coverage/runs/{runId}/package?dir=%7B%7D' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
package: {
lines: {
total: number
covered: number
}
branches: {
total: number
covered: number
}
functions: {
total: number
covered: number
}
name: string
dir: string
status: "error" | "failed" | "passed"
tests: {
total: number
passed: number
failed: number
skipped: number
todo: number
cancelled: number
}
durationMs: number
files: {
loaded: number
source: number
}
leastCovered: {
lines: {
total: number
covered: number
}
branches: {
total: number
covered: number
}
functions: {
total: number
covered: number
}
path: string
}[]
untested: string[]
error?: string
cached?: boolean
}
}/ v1/ platform/ mirage/ competition/ circuitsEvery closed circuit on the leaderboards' list, enabled or not, with its boundary, start/finish line and length. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/mirage/competition/circuits' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
circuits: {
circuitId: string
name: string
region: string
boundary: [number, number][]
gate: [[number, number], [number, number]]
lengthKm: number
enabled: boolean
verified: boolean
notes: null | string
updatedAt: null | number
}[]
}/ v1/ platform/ mirage/ competition/ circuits/ :circuitIdAdds or changes a circuit: name, region, boundary ([lat, lon] points around the track and no public road), gate (the start/finish line, two points), lengthKm, verified, enabled (only once verified), optional notes. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
circuitIdA closed circuit's id (lower case with dashes,
phillip-island).
curl -X PUT 'https://api.cactive.com.au/v1/platform/mirage/competition/circuits/{circuitId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
circuit: {
circuitId: string
name: string
region: string
boundary: [number, number][]
gate: [[number, number], [number, number]]
lengthKm: number
enabled: boolean
verified: boolean
}
}/ v1/ platform/ mirage/ competition/ circuits/ :circuitIdDeletes a circuit. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
circuitIdA closed circuit's id (lower case with dashes,
phillip-island).
curl -X DELETE 'https://api.cactive.com.au/v1/platform/mirage/competition/circuits/{circuitId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ platform/ mirage/ competition/ factorsThe factors behind leaderboards' CO₂, charging shares and smoothness: a petrol car's grams per km, the grid's grams per kWh, off-peak and solar hours, and the smoothness thresholds. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/mirage/competition/factors' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
factors: {
iceGramsPerKm: number
gridGramsPerKwh: number
offPeak: {
from: number
to: number
}
solarHours: {
from: number
to: number
}
gentleLong: number
gentleLat: number
harshLong: number
harshLat: number
}
}/ v1/ platform/ mirage/ competition/ factorsChanges the factors (all of them). Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl -X PUT 'https://api.cactive.com.au/v1/platform/mirage/competition/factors' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
factors: {
iceGramsPerKm: number
gridGramsPerKwh: number
offPeak: {
from: number
to: number
}
solarHours: {
from: number
to: number
}
gentleLong: number
gentleLat: number
harshLong: number
harshLat: number
}
}/ v1/ platform/ mirage/ gifsMirage's GIF settings: the provider (klipy, giphy or off) and content rating in force, the defaults, and which providers have their key (never the key). Platform staff (platform:admin).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/mirage/gifs' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
provider: "off" | "klipy" | "giphy"
rating: "r" | "g" | "pg" | "pg-13"
}
defaults: {
provider: "off" | "klipy" | "giphy"
rating: "r" | "g" | "pg" | "pg-13"
}
keys: {
klipy: boolean
giphy: boolean
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ mirage/ gifsChanges the GIF provider or content rating (g, pg, pg-13, r). Applies within a minute. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl -X PUT 'https://api.cactive.com.au/v1/platform/mirage/gifs' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
provider: "off" | "klipy" | "giphy"
rating: "r" | "g" | "pg" | "pg-13"
}
defaults: {
provider: "off" | "klipy" | "giphy"
rating: "r" | "g" | "pg" | "pg-13"
}
keys: {
klipy: boolean
giphy: boolean
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ age/ settingsThe age gate's settings: mode (off, self_declared: the date of birth, estimation: a face check in ID) and the face check's rules (region, minConfidence, passLowAtLeast, underHighBelow, retries, attemptsPerDay): what's stored, what's in force, the defaults and who changed them last. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
403Age checks are changed by people.
curl 'https://api.cactive.com.au/v1/platform/age/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
stored: {
mode?: "off" | "self_declared" | "estimation"
estimation?: {
region?: string
minConfidence?: number
passLowAtLeast?: number
underHighBelow?: number
retries?: number
attemptsPerDay?: number
}
}
settings: {
mode: "off" | "self_declared" | "estimation"
estimation: {
region: string
minConfidence: number
passLowAtLeast: number
underHighBelow: number
retries: number
attemptsPerDay: number
}
}
defaults: {
mode: "off" | "self_declared" | "estimation"
estimation: {
region: string
minConfidence: number
passLowAtLeast: number
underHighBelow: number
retries: number
attemptsPerDay: number
}
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ age/ settingsChanges the age gate's mode or the face check's rules (estimation, any of them; null puts one back to its default). Takes effect within a minute. Audited with the mode. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
403Age checks are changed by people.
curl -X PUT 'https://api.cactive.com.au/v1/platform/age/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
previousMode: "off" | "self_declared" | "estimation"
stored: {
mode?: "off" | "self_declared" | "estimation"
estimation?: {
region?: string
minConfidence?: number
passLowAtLeast?: number
underHighBelow?: number
retries?: number
attemptsPerDay?: number
}
}
settings: {
mode: "off" | "self_declared" | "estimation"
estimation: {
region: string
minConfidence: number
passLowAtLeast: number
underHighBelow: number
retries: number
attemptsPerDay: number
}
}
defaults: {
mode: "off" | "self_declared" | "estimation"
estimation: {
region: string
minConfidence: number
passLowAtLeast: number
underHighBelow: number
retries: number
attemptsPerDay: number
}
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ age/ accountsAn account's age by email: its date of birth (and whether staff set it), the age it gives or its last check's, the gate and face checks left today. 404 when nobody has the address. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Query parameters
emailstringDefault
"".
Errors
403Age checks are changed by people.404Nobody has that email address.
curl 'https://api.cactive.com.au/v1/platform/age/accounts' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
account: {
userId: string
email: string
name: null | string
createdAt?: number
}
age: {
birthDate: null | string
birthDateSource: null | "staff" | "self"
age: null | {
outcome: "16_plus" | "under_16"
adult?: boolean
method: "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
provider: string
reference?: string
checkedAt: number
recheckAfter?: number
}
gate: {
open: true
method: "none" | "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
checkedAt: number
} | {
open: false
reason: "under_16" | "unchecked"
recheckAfter: null | number
check?: "estimation" | "date_of_birth"
}
mode: "off" | "self_declared" | "estimation"
estimation: {
available: boolean
standIn: boolean
attemptsLeft: number
inconclusive: number
retries: number
}
}
}/ v1/ platform/ age/ accounts/ :userId/ date-of-birthCorrects someone's date of birth (dateOfBirth, YYYY-MM-DD; an optional note), with their evidence. The correction becomes the account's age: earlier checks and face-check counts go. Audited with the note (what staff saw), never the date. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
userIdA member's user id (
usr_…).
Errors
403Age checks are changed by people.
curl -X PUT 'https://api.cactive.com.au/v1/platform/age/accounts/{userId}/date-of-birth' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
age: {
birthDate: null | string
birthDateSource: null | "staff" | "self"
age: null | {
outcome: "16_plus" | "under_16"
adult?: boolean
method: "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
provider: string
reference?: string
checkedAt: number
recheckAfter?: number
}
gate: {
open: true
method: "none" | "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
checkedAt: number
} | {
open: false
reason: "under_16" | "unchecked"
recheckAfter: null | number
check?: "estimation" | "date_of_birth"
}
mode: "off" | "self_declared" | "estimation"
estimation: {
available: boolean
standIn: boolean
attemptsLeft: number
inconclusive: number
retries: number
}
}
}/ v1/ platform/ age/ accounts/ :userIdClears someone's age (date of birth, checks and face-check counts), so they declare again. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
userIdA member's user id (
usr_…).
Errors
403Age checks are changed by people.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/age/accounts/{userId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
age: {
birthDate: null | string
birthDateSource: null | "staff" | "self"
age: null | {
outcome: "16_plus" | "under_16"
adult?: boolean
method: "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
provider: string
reference?: string
checkedAt: number
recheckAfter?: number
}
gate: {
open: true
method: "none" | "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
checkedAt: number
} | {
open: false
reason: "under_16" | "unchecked"
recheckAfter: null | number
check?: "estimation" | "date_of_birth"
}
mode: "off" | "self_declared" | "estimation"
estimation: {
available: boolean
standIn: boolean
attemptsLeft: number
inconclusive: number
retries: number
}
}
}/ v1/ platform/ caityThe assistant's platform settings: search (the web search provider, exa, brave or mock, any prices per 1,000 queries, the defaultPrices, and which providers have their key on this stage, never the key) voice (whether speech to speech is on, sonic, and whether this stage runs the voice bridge) and images (whether pictures are on, and each image model with its name, where it runs, what it does, price per picture and whether it's enabled), each with when it changed. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
500There's no platform table on this stage.
curl 'https://api.cactive.com.au/v1/platform/caity' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
search: {
settings: {
provider: "exa" | "brave" | "mock"
prices?: {
exa?: {
links: number
text: number
}
brave?: {
links: number
text: number
}
mock?: {
links: number
text: number
}
}
}
defaultPrices: {
exa: {
links: number
text: number
}
brave: {
links: number
text: number
}
mock: {
links: number
text: number
}
}
keys: {
exa: boolean
brave: boolean
}
updatedAt: null | number
updatedBy: null | string
}
voice: {
bridge: boolean
settings: {
sonic: boolean
}
updatedAt: null | number
updatedBy: null | string
}
images: {
on: boolean
models: {
id: string
name: string
madeIn: string
ops: ("generate" | "inpaint" | "outpaint" | "remove-background" | "restyle")[]
pricePerImage: number
enabled: boolean
}[]
updatedAt: null | number
}
codeCloud: {
settings: {
on: boolean
registries: string[]
agent: {
"linux-arm64"?: {
version: string
sha256: string
}
"linux-x64"?: {
version: string
sha256: string
}
}
minuteUsd: number
}
updatedAt: null | number
updatedBy: null | string
}
}/ v1/ platform/ caity/ searchChanges the web search provider (exa, brave or mock) and, optionally, prices ({ links, text } US$ per 1,000 queries per provider; null drops them). A provider without its key answers from the mock. Applies within a minute. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
403Caity's settings are changed by people.500There's no platform table on this stage.
curl -X PUT 'https://api.cactive.com.au/v1/platform/caity/search' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
search: {
settings: {
provider: "exa" | "brave" | "mock"
prices?: {
exa?: {
links: number
text: number
}
brave?: {
links: number
text: number
}
mock?: {
links: number
text: number
}
}
}
defaultPrices: {
exa: {
links: number
text: number
}
brave: {
links: number
text: number
}
mock: {
links: number
text: number
}
}
keys: {
exa: boolean
brave: boolean
}
updatedAt: null | number
updatedBy: null | string
}
}/ v1/ platform/ caity/ voiceTurns the assistant's speech to speech on or off (sonic). It runs only where the stage runs the voice bridge. Applies within 30 seconds. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
400Say whether speech to speech is on (sonic: true or false).403Caity's settings are changed by people.500There's no platform table on this stage.
curl -X PUT 'https://api.cactive.com.au/v1/platform/caity/voice' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
voice: {
bridge: boolean
settings: {
sonic: boolean
}
updatedAt: null | number
updatedBy: null | string
}
}/ v1/ platform/ caity/ imagesTurns the assistant's pictures on or off (on) and changes image models by id (models: { <id>: { enabled, pricePerImage } }, US$0 to US$10 a picture); what it leaves out keeps its value. Applies within 30 seconds. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
403Caity's settings are changed by people.500There's no platform table on this stage.
curl -X PUT 'https://api.cactive.com.au/v1/platform/caity/images' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
images: {
on: boolean
models: {
id: string
name: string
madeIn: string
ops: ("generate" | "inpaint" | "outpaint" | "remove-background" | "restyle")[]
pricePerImage: number
enabled: boolean
}[]
updatedAt: null | number
}
}/ v1/ platform/ caity/ code-cloudChanges Code mode in the cloud: on or off (on), the package registries its builds may reach (registries, host names or *. and a domain, at most 60), the agent release each platform runs (agent: { "linux-arm64": { version, sha256 } }, null removes one) and a build minute's price (minuteUsd). What it leaves out stays. Applies within 30 seconds. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
403Caity's settings are changed by people.500There's no platform table on this stage.
curl -X PUT 'https://api.cactive.com.au/v1/platform/caity/code-cloud' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
codeCloud: {
settings: {
on: boolean
registries: string[]
agent: {
"linux-arm64"?: {
version: string
sha256: string
}
"linux-x64"?: {
version: string
sha256: string
}
}
minuteUsd: number
}
updatedAt: null | number
updatedBy: null | string
}
}/ v1/ platform/ health/ metricsEvery Health metric definition (enabled or not): category, kind, units, aggregation, sensitivity, HealthKit mapping and leaderboard mode.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/health/metrics' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
metrics: {
metricId: string
label: string
category: "other" | "body" | "heart" | "cycle" | "activity" | "hearing" | "medications" | "mental" | "mindfulness" | "mobility" | "nutrition" | "respiratory" | "sleep" | "symptoms" | "vitals" | "sexual"
kind: "duration" | "event" | "category" | "quantity"
unit: string
units: {
id: string
label: string
factor: number
offset?: number
}[]
aggregation: "duration" | "count" | "latest" | "sum" | "average"
decimals: number
sensitivity: "standard" | "sensitive" | "sexual"
values?: {
value: number
label: string
}[]
healthKit?: {
identifier: string
kind: "category" | "quantity" | "workout"
unit?: string
readOnly?: boolean
factor?: number
categoryValues?: number[]
}
healthConnect?: string
leaderboard?: "count" | "sum" | "average"
min?: number
max?: number
pinned?: boolean
description?: string
enabled: boolean
sortOrder: number
}[]
}/ v1/ platform/ health/ metrics/ :metricIdAdds or changes a metric definition. In the platform's audit log.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
metricIdA Health metric's id from the registry (
steps,heart_rate,sleep,sexual_activity, …), asGET /v1/me/health/metricslists them.
curl -X PUT 'https://api.cactive.com.au/v1/platform/health/metrics/{metricId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
metric: {
metricId: string
label: string
category: "other" | "body" | "heart" | "cycle" | "activity" | "hearing" | "medications" | "mental" | "mindfulness" | "mobility" | "nutrition" | "respiratory" | "sleep" | "symptoms" | "vitals" | "sexual"
kind: "duration" | "event" | "category" | "quantity"
unit: string
units: {
id: string
label: string
factor: number
offset?: number
}[]
aggregation: "duration" | "count" | "latest" | "sum" | "average"
decimals: number
sensitivity: "standard" | "sensitive" | "sexual"
values?: {
value: number
label: string
}[]
healthKit?: {
identifier: string
kind: "category" | "quantity" | "workout"
unit?: string
readOnly?: boolean
factor?: number
categoryValues?: number[]
}
healthConnect?: string
leaderboard?: "count" | "sum" | "average"
min?: number
max?: number
pinned?: boolean
description?: string
enabled: boolean
sortOrder: number
}
}/ v1/ platform/ health/ metrics/ :metricId/ enabledTurns a metric on or off (enabled); definitions are never deleted. In the platform's audit log.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
metricIdA Health metric's id from the registry (
steps,heart_rate,sleep,sexual_activity, …), asGET /v1/me/health/metricslists them.
Request body
enabledbooleanrequired
Also checked: Unknown fields are rejected.
curl -X PUT 'https://api.cactive.com.au/v1/platform/health/metrics/{metricId}/enabled' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"enabled": true
}'Response 200
{
metric: {
enabled: boolean
metricId: string
label: string
category: "other" | "body" | "heart" | "cycle" | "activity" | "hearing" | "medications" | "mental" | "mindfulness" | "mobility" | "nutrition" | "respiratory" | "sleep" | "symptoms" | "vitals" | "sexual"
kind: "duration" | "event" | "category" | "quantity"
unit: string
units: {
id: string
label: string
factor: number
offset?: number
}[]
aggregation: "duration" | "count" | "latest" | "sum" | "average"
decimals: number
sensitivity: "standard" | "sensitive" | "sexual"
values?: {
value: number
label: string
}[]
healthKit?: {
identifier: string
kind: "category" | "quantity" | "workout"
unit?: string
readOnly?: boolean
factor?: number
categoryValues?: number[]
}
healthConnect?: string
leaderboard?: "count" | "sum" | "average"
min?: number
max?: number
pinned?: boolean
description?: string
sortOrder: number
}
}/ v1/ platform/ health/ metrics/ seedAdds seed definitions the registry is missing (never changes existing ones).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl -X POST 'https://api.cactive.com.au/v1/platform/health/metrics/seed' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
added: string[]
}/ v1/ platform/ health/ settingsHealth's platform settings (samples per request, how long the audit keeps entries) and their defaults.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/health/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
samplesPerRequest: number
auditDays: number
sexualLeaderboardServers: string[]
}
defaults: {
samplesPerRequest: number
auditDays: number
sexualLeaderboardServers: string[]
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ health/ settingsChanges Health's platform settings. In the platform's audit log.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl -X PUT 'https://api.cactive.com.au/v1/platform/health/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
samplesPerRequest: number
auditDays: number
sexualLeaderboardServers: string[]
}
defaults: {
samplesPerRequest: number
auditDays: number
sexualLeaderboardServers: string[]
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ health/ restricted-leaderboardsThe Mirage servers allowed leaderboards for restricted metrics, with their names. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/health/restricted-leaderboards' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
servers: {
serverId: string
name: null | string
}[]
}/ v1/ platform/ health/ restricted-leaderboards/ :serverIdAllows a Mirage server leaderboards for restricted metrics: its managers then see the option. In the platform's audit log.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
serverIdMirage server id (
gld_…).
curl -X PUT 'https://api.cactive.com.au/v1/platform/health/restricted-leaderboards/{serverId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"/ v1/ platform/ health/ restricted-leaderboards/ :serverIdTakes the allowance away: the option goes off and everyone ranked on those boards there is taken off at once (removed: opt-ins and scores). In the platform's audit log.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
serverIdMirage server id (
gld_…).
curl -X DELETE 'https://api.cactive.com.au/v1/platform/health/restricted-leaderboards/{serverId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"/ v1/ platform/ food/ receipt-rulesThe supermarkets whose e-receipts Food reads (stores, enabled or not, in order: sender domains, receipt words, end-of-items and not-item lines, house brands, how their PDFs are read (pdf: rules, model or off)), the words that mark a receipt line as not food (nonFoodWords), and which kinds are still the seed (seed). Platform staff only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/food/receipt-rules' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
stores: {
name: string
pdf: "off" | "model" | "rules"
enabled: boolean
sortOrder: number
senderDomains: string[]
receiptMarks: string[]
endMarks: string[]
skipMarks: string[]
brandPrefixes: string[]
storeId: string
updatedAt?: number
}[]
nonFoodWords: string[]
seed: {
stores: boolean
nonFoodWords: boolean
}
}/ v1/ platform/ food/ receipt-stores/ :storeIdCreates or replaces a receipt store. Sender domains must be the store's own (public suffixes and free mail are refused). Mail and Food use it within a minute. Audited.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
storeIdA Food receipt store's id (lower-case letters, digits and hyphens, e.g.
woolworths).
Request body
namestringrequired1–60 characters. Trimmed.
senderDomainsstring[]required1–20 items. Each up to 253 characters, trimmed, lowercased.
receiptMarksany JSONrequiredendMarksany JSONrequiredskipMarksany JSONrequiredbrandPrefixesany JSONrequiredpdf"rules" | "model" | "off"Default
"rules".enabledbooleanDefault
true.sortOrderintegerDefault
0. 0–100000.
Also checked: Unknown fields are rejected.
curl -X PUT 'https://api.cactive.com.au/v1/platform/food/receipt-stores/{storeId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"senderDomains": [
"example"
],
"receiptMarks": {},
"endMarks": {},
"skipMarks": {},
"brandPrefixes": {}
}'Response 200
{
store: {
name: string
createdAt?: number
updatedAt?: number
pdf?: "off" | "model" | "rules"
enabled?: boolean
sortOrder?: number
storeId: string
senderDomains: string[]
receiptMarks: string[]
endMarks: string[]
skipMarks: string[]
brandPrefixes: string[]
}
}/ v1/ platform/ food/ receipt-stores/ :storeIdRemoves a receipt store. With none left, the seed's stores are read again; turn a store off to read none. Audited.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
storeIdA Food receipt store's id (lower-case letters, digits and hyphens, e.g.
woolworths).
Errors
404Store not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/food/receipt-stores/{storeId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ platform/ food/ non-food-wordsAdds a non-food word (word, stored lower case). Audited.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
wordstringrequiredUp to 60 characters.
Also checked: Unknown fields are rejected.
Errors
400A word to match is 2 to 40 letters, digits, spaces or hyphens.
curl -X POST 'https://api.cactive.com.au/v1/platform/food/non-food-words' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"word": "example"
}'Response 201
{
word: string
}/ v1/ platform/ food/ non-food-words/ :wordRemoves a non-food word. Audited.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
wordA Food non-food word, URL-encoded (e.g.
gift%20card).
Errors
404Word not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/food/non-food-words/{word}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ platform/ food/ receipt-rules/ testReads a pasted e-receipt (from, subject, body as HTML or text), a PDF receipt (pdf, base64, up to 110 KB) or both with the saved rules, as Food does without the model: the store, whether it's a receipt, where the lines came from, what became of the PDF (its text, or why it wasn't read), the date, the total and each line, food or not. Nothing is kept.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
fromstringrequired3–320 characters. Trimmed.
subjectstringDefault
"". Up to 300 characters.bodystringDefault
"". Up to 200,000 characters.pdfstring
Also checked: Unknown fields are rejected. Paste a receipt or choose a PDF.
curl -X POST 'https://api.cactive.com.au/v1/platform/food/receipt-rules/test' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"from": "example"
}'Response 200
{
result: {
lines: {
ingredientId?: string
food: boolean
unit?: "slice" | "head" | "g" | "kg" | "mg" | "oz" | "lb" | "ml" | "l" | "tsp" | "tbsp" | "cup" | "floz" | "pint" | "quart" | "pinch" | "dash" | "piece" | "clove" | "can" | "jar" | "bunch" | "handful" | "sprig" | "sheet" | "packet" | "stick" | "fillet" | "rasher" | "leaf" | "stalk"
quantity?: number
text: string
name: string
price?: number
}[]
total?: number
purchasedOn?: string
model: "text" | "pdf"
pdf?: {
read: true
pages: number
text: string
truncated: boolean
} | {
read: false
problem: "not-pdf" | "too-large" | "encrypted" | "too-complex" | "unreadable" | "no-text"
message: string
} | {
read: false
skipped: "off" | "model"
}
marked: boolean
isReceipt: boolean
source: "message" | "pdf"
store?: {
id: string
name: string
}
}
}/ v1/ platform/ profile-effectsEvery profile effect in the catalogue (enabled or not): id, name, renderer (sparkles, snow, hearts, glow, aurora or confetti), colors and order.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/profile-effects' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
effects: {
effectId: string
name: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
enabled: boolean
sortOrder: number
}[]
}/ v1/ platform/ profile-effects/ :effectIdAdds or changes a profile effect (name, renderer, one to four colors, enabled, sortOrder). People wearing it keep the look they chose until they choose again. In the platform's audit log.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
effectIdA profile effect's id from the catalogue (
starlight,northern-lights): 2–40 lowercase letters, digits or hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/profile-effects/{effectId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
effect: {
effectId: string
name: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
enabled: boolean
sortOrder: number
}
}/ v1/ platform/ profile-effects/ :effectId/ enabledTurns a profile effect on or off (enabled): off, nobody can choose it. In the platform's audit log.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
effectIdA profile effect's id from the catalogue (
starlight,northern-lights): 2–40 lowercase letters, digits or hyphens.
Request body
enabledbooleanrequired
Also checked: Unknown fields are rejected.
curl -X PUT 'https://api.cactive.com.au/v1/platform/profile-effects/{effectId}/enabled' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"enabled": true
}'Response 200
{
effect: {
effectId: string
name: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
enabled: boolean
sortOrder: number
}
}/ v1/ platform/ profile-effects/ seedAdds the built-in profile effects the catalogue is missing (never changes existing ones).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl -X POST 'https://api.cactive.com.au/v1/platform/profile-effects/seed' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
added: string[]
}/ v1/ platform/ localesThe languages people can choose, as data (locales: locale, label, spelling (au or us), weekStart (0 Sunday … 6 Saturday), enabled, sortOrder), whether a list is stored or the built-in one applies, the built-in one, and who changed it last. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/locales' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
locales: {
locale: string
label: string
spelling: "au" | "us"
weekStart: number
enabled: boolean
sortOrder: number
}[]
stored: boolean
defaults: {
locale: string
label: string
spelling: "au" | "us"
weekStart: number
enabled: boolean
sortOrder: number
}[]
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ localesReplaces the list of languages (locales: the whole list; null goes back to the built-in English (Australia) and English (US)). en-AU stays enabled; each language once. People's apps see the change within a minute. In the platform's audit log.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
400Sendlocales: the list, or null for the built-in one.
curl -X PUT 'https://api.cactive.com.au/v1/platform/locales' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
locales: {
locale: string
label: string
spelling: "au" | "us"
weekStart: number
enabled: boolean
sortOrder: number
}[]
stored: boolean
defaults: {
locale: string
label: string
spelling: "au" | "us"
weekStart: number
enabled: boolean
sortOrder: number
}[]
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ badgesThe settings, the seed (to reset to) and who saved them last.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/badges' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
tiers: {
tierId: string
name: string
months: number
art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
}[]
earlySupporterCutoff: string
gapDays: number
}
defaults: {
tiers: {
tierId: string
name: string
months: number
art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
}[]
earlySupporterCutoff: string
gapDays: number
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ badgesSaves the tiers, the cutoff (YYYY-MM-DD) and the lapse allowed in days.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl -X PUT 'https://api.cactive.com.au/v1/platform/badges' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
tiers: {
tierId: string
name: string
months: number
art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
}[]
earlySupporterCutoff: string
gapDays: number
}
defaults: {
tiers: {
tierId: string
name: string
months: number
art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
}[]
earlySupporterCutoff: string
gapDays: number
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ badges/ people/ :whoOne person (usr_… or their email): their badges, whether they show them, staff's grant and the accounts that count.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
whoA person's user id (
usr_…) or an email address, as listed in the request's participants.
curl 'https://api.cactive.com.au/v1/platform/badges/people/{who}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
person: {
userId: string
name: null | string
email: string
badges: {
kind: "early-supporter"
since: null | number
} | {
kind: "subscriber"
since: number
tier: {
form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
name: string
months: number
art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
id: string
}
}[]
hidden: boolean
grant: null | {
state: "revoked" | "granted"
by: string
at: number
}
accounts: {
ownerId: string
ownerType: "user" | "org"
status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
subscribedAt?: number
firstPaidAt?: number
paidSince?: number
lapsedAt?: number
}[]
}
}/ v1/ platform/ badges/ people/ :who/ early-supporterEarly Supporter by hand: granted, revoked, or auto (billing decides again).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
whoA person's user id (
usr_…) or an email address, as listed in the request's participants.
Request body
state"granted" | "revoked" | "auto"required
Also checked: Unknown fields are rejected.
curl -X PUT 'https://api.cactive.com.au/v1/platform/badges/people/{who}/early-supporter' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"state": "granted"
}'Response 200
{
person: {
userId: string
name: null | string
email: string
badges: {
kind: "early-supporter"
since: null | number
} | {
kind: "subscriber"
since: number
tier: {
form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
name: string
months: number
art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
id: string
}
}[]
hidden: boolean
grant: null | {
state: "revoked" | "granted"
by: string
at: number
}
accounts: {
ownerId: string
ownerType: "user" | "org"
status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
subscribedAt?: number
firstPaidAt?: number
paidSince?: number
lapsedAt?: number
}[]
}
}/ v1/ platform/ people/ subsidisedEveryone the platform pays a personal plan for, newest first (an ended one until the reconcile removes it).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/people/subsidised' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
people: {
userId: string
name: null | string
email: string
plan: {
planId?: string
via: "subsidised" | "subscription" | "free"
planName?: string
}
subsidy: null | {
planId: string
planName?: string
by: string
byLabel?: string
at: number
until?: number
note?: string
active: boolean
}
subscription: null | {
planId?: string
planName?: string
status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
interval?: "month" | "two-year" | "year"
}
}[]
}/ v1/ platform/ people/ :whoOne person (usr_… or their email): the plan they have, a subsidy and their own subscription.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
whoA person's user id (
usr_…) or an email address, as listed in the request's participants.
curl 'https://api.cactive.com.au/v1/platform/people/{who}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
person: {
userId: string
name: null | string
email: string
plan: {
planId?: string
via: "subsidised" | "subscription" | "free"
planName?: string
}
subsidy: null | {
planId: string
planName?: string
by: string
byLabel?: string
at: number
until?: number
note?: string
active: boolean
}
subscription: null | {
planId?: string
planName?: string
status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
interval?: "month" | "two-year" | "year"
}
}
}/ v1/ platform/ people/ :who/ subsidyGives the person a personal plan the platform pays for, or changes its plan, end (until, ms; null: no end) or note (null clears it). No card and no subscription; one they pay for keeps running and they get the higher of the two.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
whoA person's user id (
usr_…) or an email address, as listed in the request's participants.
Request body
planIdstringrequiredMatches
^[a-z0-9][a-z0-9-]{1,62}$.untilintegeror null> 0.
notestringor nullUp to 500 characters.
Also checked: Unknown fields are rejected.
curl -X PUT 'https://api.cactive.com.au/v1/platform/people/{who}/subsidy' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"planId": "<planId>"
}'Response 200
{
person: {
userId: string
name: null | string
email: string
plan: {
planId?: string
via: "subsidised" | "subscription" | "free"
planName?: string
}
subsidy: null | {
planId: string
planName?: string
by: string
byLabel?: string
at: number
until?: number
note?: string
active: boolean
}
subscription: null | {
planId?: string
planName?: string
status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
interval?: "month" | "two-year" | "year"
}
}
}/ v1/ platform/ people/ :who/ subsidyTakes the subsidy away: back to their paid plan, else Free (files kept; the retention period starts).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
whoA person's user id (
usr_…) or an email address, as listed in the request's participants.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/people/{who}/subsidy' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
person: {
userId: string
name: null | string
email: string
plan: {
planId?: string
via: "subsidised" | "subscription" | "free"
planName?: string
}
subsidy: null | {
planId: string
planName?: string
by: string
byLabel?: string
at: number
until?: number
note?: string
active: boolean
}
subscription: null | {
planId?: string
planName?: string
status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
interval?: "month" | "two-year" | "year"
}
}
}/ v1/ platform/ mirage/ reportsEvery Mirage report (open ones, or status=all), newest first, with the reporter and server: the platform's review queue. before pages. platform:admin.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Query parameters
statusstringbeforestring
curl 'https://api.cactive.com.au/v1/platform/mirage/reports' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
reports: {
reporter?: {
userId: string
name: string
}
serverName?: null | string
reportId: string
kind: "post" | "message" | "user" | "server" | "dm_message" | "story"
status: "open" | "dismissed" | "actioned"
reason: string
reasonLabel: string
details: null | string
target: {
userId: string
name: string
}
serverId: null | string
channelId: null | string
messageId: null | string
dmId: null | string
snapshot: unknown
resolvedBy: null | {
userId: string
name: string
}
resolvedAt: null | number
note: null | string
createdAt: number
}[]
next: null | string
}/ v1/ platform/ mirage/ reports/ :reportIdMarks any report actioned, dismissed or open, with an optional note. platform:admin.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
reportIdA report's id: a Mirage report's (
mrp_…) or a feedback report's (fbk_…).
Errors
403Reports are reviewed by people.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/mirage/reports/{reportId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
report: {
reporter?: {
userId: string
name: string
}
serverName?: null | string
reportId: string
kind: "post" | "message" | "user" | "server" | "dm_message" | "story"
status: "open" | "dismissed" | "actioned"
reason: string
reasonLabel: string
details: null | string
target: {
userId: string
name: string
}
serverId: null | string
channelId: null | string
messageId: null | string
dmId: null | string
snapshot: unknown
resolvedBy: null | {
userId: string
name: string
}
resolvedAt: null | number
note: null | string
createdAt: number
}
}/ v1/ platform/ pipelines/ runnersEvery hosted runner type (enabled or not): label, CodeBuild project, environment and compute type, image, minute multiplier, longest timeout, Docker, orgs it's limited to. Needs platform:admin.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
503No platform table
curl 'https://api.cactive.com.au/v1/platform/pipelines/runners' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
runners: {
label: string
description: string
project: "lambda" | "container"
environmentType: string
computeType: string
image: string
multiplier: number
maxMinutes: number
docker: boolean
orgs: string[]
isDefault: boolean
enabled: boolean
sortOrder: number
}[]
}/ v1/ platform/ pipelines/ runners/ :labelCreates or changes a hosted runner type (Lambda compute: at most 15 minutes, no Docker). Needs platform:infra.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:infra in the platform organisation
Path parameters
labelHosted runner type label, e.g.
linux-arm64.
Request body
descriptionstringDefault
"". Up to 200 characters. Trimmed.project"lambda" | "container"requiredenvironmentType"ARM_LAMBDA_CONTAINER" | "LINUX_LAMBDA_CONTAINER" | "ARM_CONTAINER" | "LINUX_CONTAINER"requiredcomputeTypestringrequiredMatches
^BUILD_(LAMBDA_\d+GB|GENERAL1_[A-Z0-9]+)$.imagestringrequired3–300 characters. Trimmed.
multipliernumberDefault
1. 0–100.maxMinutesintegerrequired1–2160.
dockerbooleanDefault
false.orgsstring[]Default
[]. Up to 100 items. Each matches^org_[0-9a-z]+$.isDefaultbooleanDefault
false.enabledbooleanDefault
true.sortOrderintegerDefault
0.
Errors
400Labels are lower case letters, numbers, '.' and '-' (not hosted, self-hosted or platform-deploy)400Lambda compute: a Lambda environment type, at most 15 minutes, no Docker400Container runners use ARM_CONTAINER or LINUX_CONTAINER503No platform table
curl -X PUT 'https://api.cactive.com.au/v1/platform/pipelines/runners/{label}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"project": "lambda",
"environmentType": "ARM_LAMBDA_CONTAINER",
"computeType": "example",
"image": "example",
"maxMinutes": 1
}'Response 200
{
runner: {
label: string
createdAt?: number
updatedAt?: number
project: "lambda" | "container"
description?: string
image: string
enabled?: boolean
orgs?: string[]
isDefault?: boolean
sortOrder?: number
environmentType: string
computeType: string
multiplier?: number
maxMinutes: number
docker?: boolean
}
}/ v1/ platform/ pipelines/ runners/ :labelRemoves a hosted runner type; jobs naming it fail with the list of others. Needs platform:infra.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:infra in the platform organisation
Path parameters
labelHosted runner type label, e.g.
linux-arm64.
Errors
503No platform table
curl -X DELETE 'https://api.cactive.com.au/v1/platform/pipelines/runners/{label}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ platform/ pipelines/ settingsThe platform's pipeline settings (matrix and run size, log, artifact and cache sizes, workflow file size, schedule interval, approval expiry, queue timeout, secret size and count) and their defaults. Needs platform:admin.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
503No platform table
curl 'https://api.cactive.com.au/v1/platform/pipelines/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
maxMatrixJobs: number
maxJobs: number
maxLogMb: number
maxArtifactMb: number
maxCacheMb: number
maxWorkflowKb: number
scheduleMinMinutes: number
approvalDays: number
queueHours: number
heartbeatMinutes: number
defaultArtifactDays: number
cacheUnusedDays: number
secretKb: number
maxSecrets: number
}
defaults: {
maxMatrixJobs: number
maxJobs: number
maxLogMb: number
maxArtifactMb: number
maxCacheMb: number
maxWorkflowKb: number
scheduleMinMinutes: number
approvalDays: number
queueHours: number
heartbeatMinutes: number
defaultArtifactDays: number
cacheUnusedDays: number
secretKb: number
maxSecrets: number
}
}/ v1/ platform/ pipelines/ settingsChanges the pipeline settings; they apply within a minute. Needs platform:infra.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:infra in the platform organisation
Request body
maxMatrixJobsintegerrequired1–1000.
maxJobsintegerrequired1–1000.
maxLogMbintegerrequired1–1024.
maxArtifactMbintegerrequired1–5120.
maxCacheMbintegerrequired1–5120.
maxWorkflowKbintegerrequired16–4096.
scheduleMinMinutesintegerrequired1–1440.
approvalDaysintegerrequired1–90.
queueHoursintegerrequired1–168.
heartbeatMinutesintegerrequired1–60.
defaultArtifactDaysintegerrequired1–400.
cacheUnusedDaysintegerrequired1–90.
secretKbintegerrequired1–64.
maxSecretsintegerrequired1–1000.
Errors
503No platform table
curl -X PUT 'https://api.cactive.com.au/v1/platform/pipelines/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"maxMatrixJobs": 1,
"maxJobs": 1,
"maxLogMb": 1,
"maxArtifactMb": 1,
"maxCacheMb": 1,
"maxWorkflowKb": 1,
"scheduleMinMinutes": 1,
"approvalDays": 1,
"queueHours": 1,
"heartbeatMinutes": 1,
"defaultArtifactDays": 1,
"cacheUnusedDays": 1,
"secretKb": 1,
"maxSecrets": 1
}'Response 200
{
settings: {
maxMatrixJobs: number
maxJobs: number
maxLogMb: number
maxArtifactMb: number
maxCacheMb: number
maxWorkflowKb: number
scheduleMinMinutes: number
approvalDays: number
queueHours: number
heartbeatMinutes: number
defaultArtifactDays: number
cacheUnusedDays: number
secretKb: number
maxSecrets: number
}
}/ v1/ platform/ feedbackThe inbox: reports newest first (open ones unless status says otherwise), filtered, with possible duplicates.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Errors
400Unknown filter.403Feedback is reviewed by people.
curl 'https://api.cactive.com.au/v1/platform/feedback' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
reports: {
reportId: string
type: "suggestion" | "bug" | "feedback"
typeLabel: string
status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
severity: null | "low" | "medium" | "high" | "critical"
title: string
description: string
app: string
appLabel: string
reporter: {
userId: string
name: null | string
email: null | string
}
contactOk: boolean
orgId: null | string
context: {
app?: string
appName?: string
version?: string
build?: string
path?: string
orgId?: string
browser?: string
os?: string
device?: string
viewport?: {
width: number
height: number
scale?: number
}
locale?: string
timeZone?: string
shell?: string
errors?: {
message: string
at: number
source?: string
}[]
requests?: {
method: string
url: string
status: number
at: number
}[]
routes?: {
path: string
at: number
}[]
}
images: {
imageId: string
type: "image/png" | "image/jpeg" | "image/webp"
size: number
}[]
fingerprint: string
similar: {
count: number
reportIds: string[]
}
spamReason: null | string
commentCount: number
issue: null | {
orgId: string
issueId: string
key: string
spaceKey: string
}
updatedBy: null | string
createdAt: number
submittedAt: number
updatedAt?: number
}[]
next: null | string
counts: {
resolved: number
dismissed: number
spam: number
new: number
triaged: number
}
apps: {
app: string
label: string
}[]
}/ v1/ platform/ feedback/ :reportIdOne report: images (signed links), comments and possible duplicates.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
reportIdA report's id: a Mirage report's (
mrp_…) or a feedback report's (fbk_…).
Errors
403Feedback is reviewed by people.
curl 'https://api.cactive.com.au/v1/platform/feedback/{reportId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
report: {
images: {
url: null | string
imageId: string
type: "image/png" | "image/jpeg" | "image/webp"
size: number
}[]
reportId: string
type: "suggestion" | "bug" | "feedback"
typeLabel: string
status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
severity: null | "low" | "medium" | "high" | "critical"
title: string
description: string
app: string
appLabel: string
reporter: {
userId: string
name: null | string
email: null | string
}
contactOk: boolean
orgId: null | string
context: {
app?: string
appName?: string
version?: string
build?: string
path?: string
orgId?: string
browser?: string
os?: string
device?: string
viewport?: {
width: number
height: number
scale?: number
}
locale?: string
timeZone?: string
shell?: string
errors?: {
message: string
at: number
source?: string
}[]
requests?: {
method: string
url: string
status: number
at: number
}[]
routes?: {
path: string
at: number
}[]
}
fingerprint: string
similar: {
count: number
reportIds: string[]
}
spamReason: null | string
commentCount: number
issue: null | {
orgId: string
issueId: string
key: string
spaceKey: string
}
updatedBy: null | string
createdAt: number
submittedAt: number
updatedAt?: number
}
comments: {
commentId: string
author: {
userId: string
name: null | string
}
body: string
createdAt?: number
}[]
similar: {
reportId: string
title: string
type: "suggestion" | "bug" | "feedback"
status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
appLabel: string
createdAt?: number
}[]
}/ v1/ platform/ feedback/ :reportIdTriage: status, severity (bugs) or type.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
reportIdA report's id: a Mirage report's (
mrp_…) or a feedback report's (fbk_…).
Errors
403Feedback is reviewed by people.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/feedback/{reportId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
report: {
reportId: string
type: "suggestion" | "bug" | "feedback"
typeLabel: string
status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
severity: null | "low" | "medium" | "high" | "critical"
title: string
description: string
app: string
appLabel: string
reporter: {
userId: string
name: null | string
email: null | string
}
contactOk: boolean
orgId: null | string
context: {
app?: string
appName?: string
version?: string
build?: string
path?: string
orgId?: string
browser?: string
os?: string
device?: string
viewport?: {
width: number
height: number
scale?: number
}
locale?: string
timeZone?: string
shell?: string
errors?: {
message: string
at: number
source?: string
}[]
requests?: {
method: string
url: string
status: number
at: number
}[]
routes?: {
path: string
at: number
}[]
}
images: {
imageId: string
type: "image/png" | "image/jpeg" | "image/webp"
size: number
}[]
fingerprint: string
similar: {
count: number
reportIds: string[]
}
spamReason: null | string
commentCount: number
issue: null | {
orgId: string
issueId: string
key: string
spaceKey: string
}
updatedBy: null | string
createdAt: number
submittedAt: number
updatedAt?: number
}
}/ v1/ platform/ feedback/ :reportId/ commentsAn admin's comment (only admins see them).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
reportIdA report's id: a Mirage report's (
mrp_…) or a feedback report's (fbk_…).
Errors
403Feedback is reviewed by people.
curl -X POST 'https://api.cactive.com.au/v1/platform/feedback/{reportId}/comments' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 201
{
comment: {
commentId: string
author: {
userId: string
name: null | string
}
body: string
createdAt: number
}
}/ v1/ platform/ feedback/ :reportId/ convertTurns a report into an issue in one of the platform org's Tasks spaces (space: its key or id), with its text, context and images; the report links to the issue and is triaged.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
reportIdA report's id: a Mirage report's (
mrp_…) or a feedback report's (fbk_…).
Errors
400Choose a space.403Feedback is reviewed by people.403Missing scope platform:admin
curl -X POST 'https://api.cactive.com.au/v1/platform/feedback/{reportId}/convert' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
issue: {
orgId: string
issueId: string
key: string
spaceKey: string
}
report: {
reportId: string
type: "suggestion" | "bug" | "feedback"
typeLabel: string
status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
severity: null | "low" | "medium" | "high" | "critical"
title: string
description: string
app: string
appLabel: string
reporter: {
userId: string
name: null | string
email: null | string
}
contactOk: boolean
orgId: null | string
context: {
app?: string
appName?: string
version?: string
build?: string
path?: string
orgId?: string
browser?: string
os?: string
device?: string
viewport?: {
width: number
height: number
scale?: number
}
locale?: string
timeZone?: string
shell?: string
errors?: {
message: string
at: number
source?: string
}[]
requests?: {
method: string
url: string
status: number
at: number
}[]
routes?: {
path: string
at: number
}[]
}
images: {
imageId: string
type: "image/png" | "image/jpeg" | "image/webp"
size: number
}[]
fingerprint: string
similar: {
count: number
reportIds: string[]
}
spamReason: null | string
commentCount: number
issue: null | {
orgId: string
issueId: string
key: string
spaceKey: string
}
updatedBy: null | string
createdAt: number
submittedAt: number
updatedAt?: number
}
}/ v1/ platform/ feedback/ :reportIdDeletes a report, its comments and its images.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
reportIdA report's id: a Mirage report's (
mrp_…) or a feedback report's (fbk_…).
Errors
403Feedback is reviewed by people.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/feedback/{reportId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
reportId: string
}/ v1/ platform/ deletionsAdmin → Deletions: open account deletion requests by when they're due, then recent closed ones (or those with status), with the person's address until erased, the grace, where it was asked from, and in shadow mode the plan its erasure would run. platform:admin.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Query parameters
status"scheduled" | "cancelled" | "blocked" | "erasing" | "finalising" | "erased"
curl 'https://api.cactive.com.au/v1/platform/deletions' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
deletions: {
delId: string
status: "blocked" | "cancelled" | "scheduled" | "erasing" | "finalising" | "erased"
email?: string
requestedAt: number
eraseAt: number
graceDays: number
graceReason?: string
client: string
app?: string
reason?: string
cancelledAt?: number
cancelledBy?: string
plannedAt?: number
planCounts?: {
[key: string]: {
[key: string]: number
}
}
tasks: {
total: number
done: number
failed: string[]
}
held?: boolean
}[]
launched: true
}/ v1/ platform/ deletions/ :delIdOne account deletion request and each handler's task (phase, status, attempts, counts, last error code). platform:admin.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
delIdAn account deletion request's id (
del_…).
Errors
400Not a deletion id.
curl 'https://api.cactive.com.au/v1/platform/deletions/{delId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
taskList: {
updatedAt: number
error?: string
phase: "plan" | "erase" | "finalise"
service: string
status: "pending" | "done" | "failed" | "running"
attempts: number
counts: unknown
}[]
delId: string
status: "blocked" | "cancelled" | "scheduled" | "erasing" | "finalising" | "erased"
email?: string
requestedAt: number
eraseAt: number
graceDays: number
graceReason?: string
client: string
app?: string
reason?: string
cancelledAt?: number
cancelledBy?: string
plannedAt?: number
planCounts?: {
[key: string]: {
[key: string]: number
}
}
tasks: {
total: number
done: number
failed: string[]
}
held?: boolean
}/ v1/ platform/ orgsPlatform organizations and the newest customer organizations.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/orgs' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
orgs: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
kind: "platform" | "customer"
planId?: string
subsidised?: boolean
billingRequired?: boolean
pending?: boolean
auditExportBucketId?: string
logoUri?: string
contactEmail?: string
authStrength?: "any" | "mfa" | "passkey"
authMethods?: string[]
authGraceUntil?: number
sessionHours?: number
externalSharing?: "off" | "accounts" | "links"
allowedDomains?: string[]
linkMaxDays?: number
assistantEnabled?: boolean
assistantMaxMode?: "ask" | "reads" | "app" | "auto"
assistantApps?: string[]
assistantPublicShares?: boolean
hiddenApps?: string[]
formerSlugs?: string[]
slugChangedAt?: number
hostSlug?: string
}[]
}/ v1/ platform/ orgsOnboards a customer: the org (slug claimed atomically, optional plan) and an owner invite. The invite link is in the response once (and mailed where SES is set up); the owner joins through ID.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
namestringrequired1–64 characters. Trimmed.
slugstringrequiredMatches
^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){1,38}$. Trimmed.ownerEmailstringrequiredUp to 254 characters. Email address.
planIdstringor nullMatches
^[a-z0-9][a-z0-9-]{1,62}$.subsidisedbooleanDefault
false.
Errors
400Unknown plan403Onboarding needs a signed-in admin.
curl -X POST 'https://api.cactive.com.au/v1/platform/orgs' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"slug": "example",
"ownerEmail": "person@example.com"
}'Response 201
{
org: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
kind: "platform" | "customer"
planId?: string
subsidised?: boolean
billingRequired?: boolean
pending?: boolean
auditExportBucketId?: string
logoUri?: string
contactEmail?: string
authStrength?: "any" | "mfa" | "passkey"
authMethods?: string[]
authGraceUntil?: number
sessionHours?: number
externalSharing?: "off" | "accounts" | "links"
allowedDomains?: string[]
linkMaxDays?: number
assistantEnabled?: boolean
assistantMaxMode?: "ask" | "reads" | "app" | "auto"
assistantApps?: string[]
assistantPublicShares?: boolean
hiddenApps?: string[]
formerSlugs?: string[]
slugChangedAt?: number
hostSlug?: string
}
invite: {
inviteId: string
email: string
link: string
delivered: boolean
expiresAt: number
}
}/ v1/ platform/ orgs/ :orgIdAssigns an organization to a plan (planId; null returns it to the default plan) and/or sets whether the platform pays for it (subsidised: every app, no card). Ending a subsidy makes the organization subscribe in Tenant → Billing before its apps open again.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
orgIdOrganization id (
org_…).
Request body
planIdstringor nullMatches
^[a-z0-9][a-z0-9-]{1,62}$.subsidisedboolean
Errors
400Unknown plan404Organization not found
curl -X PATCH 'https://api.cactive.com.au/v1/platform/orgs/{orgId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"planId": "<planId>",
"subsidised": true
}'Response 200
{
org: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
kind: "platform" | "customer"
planId?: string
subsidised?: boolean
billingRequired?: boolean
pending?: boolean
auditExportBucketId?: string
logoUri?: string
contactEmail?: string
authStrength?: "any" | "mfa" | "passkey"
authMethods?: string[]
authGraceUntil?: number
sessionHours?: number
externalSharing?: "off" | "accounts" | "links"
allowedDomains?: string[]
linkMaxDays?: number
assistantEnabled?: boolean
assistantMaxMode?: "ask" | "reads" | "app" | "auto"
assistantApps?: string[]
assistantPublicShares?: boolean
hiddenApps?: string[]
formerSlugs?: string[]
slugChangedAt?: number
hostSlug?: string
}
}/ v1/ platform/ statsCounts of organizations, customers, regions and locations.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/stats' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
orgs: number
customers: number
regions: number
locations: number
}/ v1/ platform/ auditThe platform organization's audit log: registry and plan changes, onboarding and the platform organization's own activity.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Query parameters
cursorstringUp to 4,096 characters.
actionstringMatches
^[a-z_]{1,32}(\.[a-z_]{1,32})?$.actorstring1–512 characters.
targetstringMatches
^[a-z_]{1,32}:[^\s]{1,512}$.limitintegerDefault
50. 1–100. Coerced from a string.
Errors
400Invalid cursor403Missing scope platform:admin
curl 'https://api.cactive.com.au/v1/platform/audit' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
events: {
eventId: string
orgId: string
action: string
actor: {
type: "user" | "key" | "device" | "system"
id: string
label?: string
}
target: {
type: string
id: string
label?: string
}
metadata?: {
[key: string]: unknown
}
ip?: string
userAgent?: string
createdAt: number
}[]
cursor: null | string
retentionDays?: number
}/ v1/ platform/ oauth-clientsSelf-registered (MCP) clients at ID: who registered what, how many people connected, last use.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/oauth-clients' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
clients: {
connections: number
createdAt?: number
lastUsedAt?: number
expiresAt?: number
logoUri?: string
clientUri?: string
clientId: string
name: string
redirectUris: string[]
}[]
}/ v1/ platform/ oauth-clients/ :clientIdRemoves a self-registered client: its approvals and refresh tokens stop working at once (the token endpoint no longer knows the client); access tokens it holds last up to an hour.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
clientIdSign-in client id (
cli_…).
Errors
404Client not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/oauth-clients/{clientId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ platform/ regionsThe region and location registry.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:infra in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/regions' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
regions: {
name: string
status?: "active" | "disabled"
createdAt?: number
updatedAt?: number
unavailable?: string[]
regionId: string
}[]
locations: {
label: string
status?: "active" | "disabled" | "preview"
createdAt?: number
updatedAt?: number
locationId: string
isDefault?: boolean
regions: string[]
sortOrder?: number
}[]
}/ v1/ platform/ regions/ :regionIdCreates or replaces a region. Services that ran from the cached registry see the change within a minute.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:infra in the platform organisation
Path parameters
regionIdAWS region id, e.g.
us-west-1.
Request body
namestringrequired1–100 characters.
status"active" | "disabled"Default
"active".unavailablestring[]Default
[]. Up to 100 items. Each up to 64 characters.
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/regions/{regionId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example"
}'Response 200
{
region: {
name: string
status?: "active" | "disabled"
createdAt?: number
updatedAt?: number
unavailable?: string[]
regionId: string
}
}/ v1/ platform/ locations/ :locationIdCreates or replaces a location with its ordered region list (primary first).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:infra in the platform organisation
Path parameters
locationIdLocation id: a platform location, or under Maps an org's alert location (
mlc_…).
Request body
labelstringrequired1–100 characters.
regionsstring[]required1–10 items. Each matches
^[a-z0-9][a-z0-9-]{1,62}$.status"active" | "preview" | "disabled"Default
"active".isDefaultbooleanDefault
false.sortOrderintegerDefault
0.
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/locations/{locationId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"label": "Example",
"regions": [
"example"
]
}'Response 200
{
location: {
label: string
status?: "active" | "disabled" | "preview"
createdAt?: number
updatedAt?: number
locationId: string
isDefault?: boolean
regions: string[]
sortOrder?: number
}
}/ v1/ platform/ billing/ signupsPay first (docs/billing/README.md → Pay first): the funnel for the last 30 days (checkouts started, paid, details given, onboarding complete) and the sign-ups that paid but haven't finished (the pending orgs and people), newest first.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/billing/signups' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
funnel: {
day: string
started: number
paid: number
named: number
complete: number
}[]
pending: {
signupId: string
audience: "personal" | "business"
planId: string
email?: string
orgName?: string
orgId?: string
next: "invite" | "done" | "account" | "pay" | "details" | "secure"
paidAt?: number
createdAt: number
remindersSent: number
}[]
}/ v1/ platform/ billing/ promotionsPromotion codes (docs/billing/promotions.md): the codes and coupons in the stage's payment provider, the subscriptions carrying a discount now, who may create codes, and whether this person may.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/billing/promotions' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
discounted: {
ownerId: string
ownerType: "user" | "org"
ownerName?: string
planId?: string
interval?: "month" | "two-year" | "year"
status: string
subscriptionId?: string
discount: {
percentOff?: number
amountOff?: number
currency?: string
duration: "once" | "repeating" | "forever"
durationInMonths?: number
code?: string
name?: string
startsAt?: number
endsAt?: number
}
}[]
creators: {
roles: ("owner" | "admin" | "developer" | "viewer")[]
emails: string[]
}
canCreate: boolean
mode: "local" | "live" | "test"
codes: {
promotionCodeId: string
code: string
active: boolean
couponId: string
name?: string
discount: {
percentOff?: number
amountOff?: number
currency?: string
duration: "once" | "repeating" | "forever"
durationInMonths?: number
}
usable: boolean
timesRedeemed: number
maxRedemptions?: number
expiresAt?: number
firstTimeOnly: boolean
minimumAmount?: number
planIds?: string[]
intervals?: ("month" | "two-year" | "year")[]
email?: string
ownerId?: string
customerId?: string
createdAt: number
createdBy?: string
}[]
coupons: {
createdAt: number
planIds?: string[]
discount: {
percentOff?: number
amountOff?: number
currency?: string
duration: "once" | "repeating" | "forever"
durationInMonths?: number
}
valid: boolean
timesRedeemed: number
name?: string
couponId: string
}[]
}/ v1/ platform/ billing/ promotionsMakes a code (and its coupon, unless couponId names one). Who may: billing.promotionCreators.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
codestringrequired3–40 characters. Trimmed.
namestringUp to 80 characters. Trimmed.
couponIdstringMatches
^[A-Za-z0-9_-]{1,100}$.percentOffinteger1–100.
amountOffinteger≥ 1.
duration"once" | "repeating" | "forever"durationInMonthsinteger1–36.
maxRedemptionsinteger1–1000000.
expiresAtinteger> 0.
planIdsstring[]Up to 20 items. Each matches
^[a-z0-9][a-z0-9-]{1,62}$.intervals("two-year" | "year" | "month")[]Up to 3 items.
emailstringUp to 254 characters. Email address.
ownerIdstringMatches
^(org|usr)_[A-Za-z0-9]{6,40}$.firstTimeOnlybooleanminimumAmountinteger≥ 1.
Errors
403You can't create promotion codes. Ask a platform owner (Admin → Promotions).
curl -X POST 'https://api.cactive.com.au/v1/platform/billing/promotions' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"code": "example"
}'Response 201
{
code: {
promotionCodeId: string
code: string
active: boolean
couponId: string
name?: string
discount: {
percentOff?: number
amountOff?: number
currency?: string
duration: "once" | "repeating" | "forever"
durationInMonths?: number
}
usable: boolean
timesRedeemed: number
maxRedemptions?: number
expiresAt?: number
firstTimeOnly: boolean
minimumAmount?: number
planIds?: string[]
intervals?: ("month" | "two-year" | "year")[]
email?: string
ownerId?: string
customerId?: string
createdAt: number
createdBy?: string
}
}/ v1/ platform/ billing/ promotions/ :promotionCodeIdTurns a code off (or on again): no new redemptions; discounts already given keep running.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
promotionCodeIdA promotion code's id (the payment provider's,
promo_…).
Request body
activebooleanrequired
Errors
400Invalid id: lowercase letters, digits and hyphens.403You can't change promotion codes.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/billing/promotions/{promotionCodeId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"active": true
}'Response 200
{
code: {
promotionCodeId: string
code: string
active: boolean
couponId: string
name?: string
discount: {
percentOff?: number
amountOff?: number
currency?: string
duration: "once" | "repeating" | "forever"
durationInMonths?: number
}
usable: boolean
timesRedeemed: number
maxRedemptions?: number
expiresAt?: number
firstTimeOnly: boolean
minimumAmount?: number
planIds?: string[]
intervals?: ("month" | "two-year" | "year")[]
email?: string
ownerId?: string
customerId?: string
createdAt: number
createdBy?: string
}
}/ v1/ platform/ billing/ coupons/ :couponIdDeletes a coupon: none of its codes can be redeemed any more; discounts already given keep running.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
couponIdA coupon's id (the payment provider's).
Errors
400Invalid id: lowercase letters, digits and hyphens.403You can't delete coupons.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/billing/coupons/{couponId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ platform/ billing/ redemptionsRedemptions, newest first: one code's (?promotionCodeId=) or all.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Query parameters
promotionCodeIdstring
Errors
400Invalid code id
curl 'https://api.cactive.com.au/v1/platform/billing/redemptions' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
redemptions: {
promotionCodeId: string
code: string
ownerId: string
ownerType: "user" | "org"
ownerName?: string
subscriptionId: string
planId?: string
interval?: "month" | "two-year" | "year"
at: number
}[]
}/ v1/ platform/ billing/ promotion-creatorsWho may create codes: platform roles and people. Platform owners only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
roles("owner" | "admin" | "developer" | "viewer")[]requiredUp to 4 items.
emailsstring[]requiredUp to 100 items. Each up to 254 characters, email address.
Errors
403Only platform owners can change who creates codes.
curl -X PUT 'https://api.cactive.com.au/v1/platform/billing/promotion-creators' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"roles": [
"owner"
],
"emails": [
"person@example.com"
]
}'Response 200
{
creators: {
roles: ("owner" | "admin" | "developer" | "viewer")[]
emails: string[]
}
}/ v1/ platform/ plansPlans and their settings. Organizations without a plan use the default plan.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/plans' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
plans: {
features?: string[]
name: string
createdAt?: number
updatedAt?: number
planId: string
apps?: string[]
audience?: "personal" | "business"
tagline?: string
isDefault?: boolean
sortOrder?: number
priceMonthly?: number
priceAnnual?: number
priceTwoYear?: number
offered?: boolean
trialDays?: number
support?: string
highlights?: string[]
caityMessagesPerDay?: number
auditRetentionDays: number
mailSendPerDay?: number
mailMaxMessageMb?: number
mailMaxRecipients?: number
maxConnectors?: number
maxConnectorTools?: number
driveStorageGb?: number
driveStorageGbPerUser?: number
drivePersonalStorageGb?: number
vaultMaxItems?: number
crmMaxRecords?: number
marketingContacts?: number
marketingSendsPerMonth?: number
pipelineMinutes?: number
pipelineOverage?: boolean
pipelineConcurrency?: number
pipelineMaxMinutes?: number
pipelineLogDays?: number
pipelineArtifactDays?: number
pipelineArtifactGb?: number
pipelineCacheGb?: number
keysMax?: number
keyOpsPerMonth?: number
secretsMax?: number
keyMonthlyPriceCents?: number
keyOpsPer10kPriceCents?: number
}[]
}/ v1/ platform/ plans/ :planIdCreates or replaces a plan. Optional limits that aren't sent keep their stored value; null clears one (the default applies). Making a plan the default clears the flag on the others.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
planIdPlan id.
Request body
namestringrequired1–100 characters. Trimmed.
auditRetentionDaysintegerrequired1–3650.
isDefaultbooleanDefault
false.sortOrderintegerDefault
0.mailSendPerDayintegeror null0–1000000.
mailMaxMessageMbintegeror null1–40.
mailMaxRecipientsintegeror null1–1000.
maxConnectorsintegeror null0–1000.
maxConnectorToolsintegeror null0–1000.
driveStorageGbintegeror null0–1000000.
drivePersonalStorageGbintegeror null0–1000000.
vaultMaxItemsintegeror null0–1000000.
crmMaxRecordsintegeror null0–1000000000.
marketingContactsintegeror null0–100000000.
marketingSendsPerMonthintegeror null0–1000000000.
driveStorageGbPerUserintegeror null0–1000000.
audience"business" | "personal"Default
"business".taglinestringor nullUp to 200 characters. Trimmed.
priceMonthlyintegeror null0–10000000.
priceAnnualintegeror null0–100000000.
priceTwoYearintegeror null0–200000000.
offeredbooleanor nulltrialDaysintegeror null0–90.
apps[]or nullUp to 50 items.
featuresstring[]or nullUp to 50 items. Each matches
^[a-z0-9-]{1,40}$.supportstringor nullUp to 120 characters. Trimmed.
highlightsstring[]or nullUp to 12 items. Each 1–120 characters, trimmed.
caityMessagesPerDayintegeror null0–100000.
pipelineMinutesintegeror null0–10000000.
pipelineOveragebooleanor nullpipelineConcurrencyintegeror null0–500.
pipelineMaxMinutesintegeror null1–2160.
pipelineLogDaysintegeror null1–400.
pipelineArtifactDaysintegeror null1–400.
pipelineArtifactGbintegeror null0–100000.
pipelineCacheGbintegeror null0–10000.
keysMaxintegeror null0–1000000.
keyOpsPerMonthintegeror null0–1000000000.
secretsMaxintegeror null0–1000000.
keyMonthlyPriceCentsintegeror null0–1000000.
keyOpsPer10kPriceCentsintegeror null0–1000000.
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/plans/{planId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"auditRetentionDays": 1
}'Response 200
{
plan: {
features?: string[]
name: string
createdAt?: number
updatedAt?: number
planId: string
apps?: string[]
audience?: "personal" | "business"
tagline?: string
isDefault?: boolean
sortOrder?: number
priceMonthly?: number
priceAnnual?: number
priceTwoYear?: number
offered?: boolean
trialDays?: number
support?: string
highlights?: string[]
caityMessagesPerDay?: number
auditRetentionDays: number
mailSendPerDay?: number
mailMaxMessageMb?: number
mailMaxRecipients?: number
maxConnectors?: number
maxConnectorTools?: number
driveStorageGb?: number
driveStorageGbPerUser?: number
drivePersonalStorageGb?: number
vaultMaxItems?: number
crmMaxRecords?: number
marketingContacts?: number
marketingSendsPerMonth?: number
pipelineMinutes?: number
pipelineOverage?: boolean
pipelineConcurrency?: number
pipelineMaxMinutes?: number
pipelineLogDays?: number
pipelineArtifactDays?: number
pipelineArtifactGb?: number
pipelineCacheGb?: number
keysMax?: number
keyOpsPerMonth?: number
secretsMax?: number
keyMonthlyPriceCents?: number
keyOpsPer10kPriceCents?: number
}
}/ v1/ platform/ office-templatesBuilt-in templates of Documents, Sheets and Slides (Admin → Templates): every one, hidden ones included.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/office-templates' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
templates: {
templateId: string
kind: "video" | "document" | "spreadsheet" | "presentation"
name: string
category?: string
sortOrder?: number
hidden?: boolean
}[]
}/ v1/ platform/ video-presetsVideo's export presets (Admin → Templates → Video presets): every one, hidden ones included.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/video-presets' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
presets: {
id: string
label: string
description?: string
settings: {
container: "mp4" | "webm"
video: null | {
codec: "av1" | "avc" | "hevc" | "vp9"
width: number
height: number
frameRate: {
num: number
den: number
}
bitrate: number
bitrateMode: "variable" | "constant"
keyframeEvery: number
profile?: string
hardware: "no-preference" | "prefer-hardware" | "prefer-software"
}
audio: null | {
codec: "aac" | "opus"
sampleRate: 48000 | 44100
channels: 2 | 1
bitrate: number
}
timecodeOverlay?: boolean
loudness?: null | {
target: number
truePeak: number
}
}
sortOrder: number
hidden: boolean
builtIn: boolean
}[]
}/ v1/ platform/ video-presets/ :presetIdChanges an export preset's label, description, settings, order or visibility, or adds one; the app sees it within a minute.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
presetIdAircraft preset id (lowercase letters, digits,
-and_); undervideo-presets, a video export preset's id (h264-1080p).
Request body
labelstring1–80 characters. Trimmed.
descriptionstringor nullUp to 200 characters. Trimmed.
sortOrderinteger-1000–10000.
hiddenbooleansettingsobjectsettings.container"mp4" | "webm"requiredsettings.videoobjectrequiredor nullsettings.video.codec"avc" | "hevc" | "vp9" | "av1"requiredsettings.video.widthintegerrequired0–16384.
settings.video.heightintegerrequired0–16384.
settings.video.frameRateobjectrequiredsettings.video.frameRate.numintegerrequired0–240000.
settings.video.frameRate.denintegerrequired1–1001.
settings.video.bitrateintegerrequired100000–500000000.
settings.video.bitrateMode"variable" | "constant"requiredsettings.video.keyframeEveryintegerrequired≥ 0.
settings.video.profilestringUp to 40 characters.
settings.video.hardware"no-preference" | "prefer-hardware" | "prefer-software"requiredsettings.audioobjectrequiredor nullsettings.audio.codec"aac" | "opus"requiredsettings.audio.sampleRate48000 | 44100requiredsettings.audio.channels1 | 2requiredsettings.audio.bitrateintegerrequired16000–1000000.
settings.timecodeOverlaybooleansettings.loudnessobjector nullsettings.loudness.targetnumberrequired-40–0.
settings.loudness.truePeaknumberrequired-10–0.
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/video-presets/{presetId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"label": "Example",
"description": "example",
"sortOrder": 1
}'Response 200
{
preset: {
id: string
label: string
description?: string
settings: {
container: "mp4" | "webm"
video: null | {
codec: "av1" | "avc" | "hevc" | "vp9"
width: number
height: number
frameRate: {
num: number
den: number
}
bitrate: number
bitrateMode: "variable" | "constant"
keyframeEvery: number
profile?: string
hardware: "no-preference" | "prefer-hardware" | "prefer-software"
}
audio: null | {
codec: "aac" | "opus"
sampleRate: 48000 | 44100
channels: 2 | 1
bitrate: number
}
timecodeOverlay?: boolean
loudness?: null | {
target: number
truePeak: number
}
}
sortOrder: number
hidden: boolean
builtIn: boolean
}
}/ v1/ platform/ office-fontsThe editors' fonts (Admin → Fonts): every family, hidden ones included, and whether the stage has the files.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/office-fonts' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
fonts: {
family: string
category: "serif" | "mono" | "display" | "sans"
sortOrder: number
hidden: boolean
standIn: boolean
}[]
hosted: boolean
}/ v1/ platform/ office-fonts/ :familyRecategorises, orders or hides a font; the menus see it within a minute.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
familyA font family's name as the catalogue lists it (
Open Sans), URL-encoded.
Request body
category"sans" | "serif" | "mono" | "display"sortOrderinteger-1000–10000.
hiddenboolean
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/office-fonts/{family}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"category": "sans",
"sortOrder": 1,
"hidden": true
}'Response 200
{
font: {
hidden: boolean
sortOrder: number
category: "serif" | "mono" | "display" | "sans"
family: string
standIn: boolean
}
}/ v1/ platform/ office-templates/ :templateIdRenames, recategorises, orders or hides a built-in template; the galleries see it within a minute.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
templateIdA Marketing template's id (
tpl_…).
Request body
namestring1–80 characters. Trimmed.
categorystringor nullUp to 40 characters. Trimmed.
sortOrderinteger-1000–1000.
hiddenboolean
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/office-templates/{templateId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"category": "example",
"sortOrder": 1
}'Response 200
{
template: {
hidden: boolean
sortOrder: number
templateId: string
kind: "video" | "document" | "spreadsheet" | "presentation"
name: string
category?: string
}
}/ v1/ platform/ modelsChat models and the capabilities that shape their requests. Chat reads them within the cache TTL.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/models' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
models: {
region?: string
label: string
createdAt?: number
updatedAt?: number
api?: "anthropic" | "converse"
description?: string
thinking?: "none" | "adaptive" | "budget"
effort?: "low" | "medium" | "high" | "max" | "xhigh"
documents?: boolean
enabled?: boolean
caity?: boolean
isDefault?: boolean
sortOrder?: number
modelId: string
thinkingBudget?: number
maxTokens: number
eagerToolInput?: boolean
fallbackModelIds?: string[]
fallbackModelId?: string
compactAt?: number
titles?: boolean
crossRegion?: boolean
accessFallback?: boolean
lane?: "fast" | "balanced" | "deep"
laneDefault?: boolean
vision?: boolean
contextTokens?: number
price?: unknown
plans?: string[]
}[]
}/ v1/ platform/ models/ :modelIdCreates or replaces a chat model in the catalog: label, whether it's enabled or the default, thinking and effort settings, output tokens and fallback model. Making a model the default clears the flag on the others.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
modelIdBedrock base model id, e.g.
anthropic.claude-opus-5-5.
Request body
labelstringrequired1–100 characters. Trimmed.
descriptionstringDefault
"". Up to 120 characters. Trimmed.enabledbooleanDefault
true.isDefaultbooleanDefault
false.sortOrderintegerDefault
0.thinking"adaptive" | "budget" | "none"Default
"adaptive".thinkingBudgetintegeror null1024–128000.
effort"low" | "medium" | "high" | "xhigh" | "max"or nullmaxTokensintegerrequired1024–128000.
eagerToolInputbooleanDefault
true.fallbackModelIdsstring[]Up to 8 items. Each matches
^[a-z0-9][a-z0-9.:-]{2,127}$.fallbackModelIdstringor nullMatches
^[a-z0-9][a-z0-9.:-]{2,127}$.compactAtintegeror null50000–1000000.
titlesbooleanapi"anthropic" | "converse"regionstringor nullMatches
^[a-z]{2}(-[a-z]+)+-\d$. Trimmed.crossRegionbooleanaccessFallbackbooleancaitybooleanlane"fast" | "balanced" | "deep"or nulllaneDefaultbooleanvisionbooleandocumentsbooleancontextTokensintegeror null8000–10000000.
priceobjector nullprice.inputnumberrequired0–1000.
price.outputnumberrequired0–1000.
price.cacheReadnumber0–1000.
price.cacheWritenumber0–1000.
price.longAboveinteger≥ 1000.
price.longInputnumber0–1000.
price.longOutputnumber0–1000.
plansstring[]Up to 20 items. Each 1–40 characters, trimmed.
Also checked: Caity's models use the Messages API Budget thinking needs a thinking budget below the max tokens The default model must be enabled
Errors
400Invalid id: lowercase letters, digits and hyphens.400A model can't fall back to itself400A fallback is listed twice400Unknown fallback model400Set another model as the default first400Caity's models use the Messages API
curl -X PUT 'https://api.cactive.com.au/v1/platform/models/{modelId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"label": "Example",
"maxTokens": 1
}'Response 200
{
model: {
region?: string
label: string
createdAt?: number
updatedAt?: number
api?: "anthropic" | "converse"
description?: string
thinking?: "none" | "adaptive" | "budget"
effort?: "low" | "medium" | "high" | "max" | "xhigh"
documents?: boolean
enabled?: boolean
caity?: boolean
isDefault?: boolean
sortOrder?: number
modelId: string
thinkingBudget?: number
maxTokens: number
eagerToolInput?: boolean
fallbackModelIds?: string[]
fallbackModelId?: string
compactAt?: number
titles?: boolean
crossRegion?: boolean
accessFallback?: boolean
lane?: "fast" | "balanced" | "deep"
laneDefault?: boolean
vision?: boolean
contextTokens?: number
price?: unknown
plans?: string[]
}
}/ v1/ platform/ flight-coverageAreas the Maps flight poller always covers (centre, radius, label, enabled), besides watches and areas people are viewing.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/flight-coverage' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
areas: {
label: string
createdAt?: number
updatedAt?: number
lat: number
lon: number
enabled?: boolean
sortOrder?: number
areaId: string
radiusNm: number
}[]
}/ v1/ platform/ flight-coverage/ :areaIdCreates or replaces a standing coverage area. The poller picks it up within a minute; radius is capped at the ADS-B source's maximum.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
areaIdStanding coverage area id.
Request body
labelstringrequired1–64 characters. Trimmed.
latnumberrequired-90–90.
lonnumberrequired-180–180.
radiusNmnumberrequired5–250.
enabledbooleanDefault
true.sortOrderintegerDefault
0.
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/flight-coverage/{areaId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"label": "Example",
"lat": 1,
"lon": 1,
"radiusNm": 1
}'Response 200
{
area: {
label: string
createdAt?: number
updatedAt?: number
lat: number
lon: number
enabled?: boolean
sortOrder?: number
areaId: string
radiusNm: number
}
}/ v1/ platform/ flight-sourcesMaps: the ADS-B sources the flight poller uses, in order (seeded adsb.lol, adsb.fi, ADS-B Exchange as a capped last resort). The poller reads them within the cache TTL.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/flight-sources' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
sources: {
createdAt?: number
updatedAt?: number
sourceId: string
enabled?: boolean
sortOrder?: number
use?: "all" | "last_resort"
dailyRequests?: number
monthlyRequests?: number
}[]
known: {
sourceId: "adsblol" | "adsbfi" | "airplaneslive" | "opensky" | "adsbexchange"
label: string
terms: string
maxRadiusNm: number
rate: {
burst: number
perMinute: number
}
}[]
}/ v1/ platform/ flight-sources/ :sourceIdChanges an ADS-B source: its place in the order, whether it's used, and its daily and monthly request budgets.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
sourceIdADS-B source id (
adsblol,adsbfi,adsbexchange, …).
Request body
enabledbooleanDefault
true.sortOrderintegerDefault
0.use"all" | "last_resort"Default
"all".dailyRequestsinteger0–100000.
monthlyRequestsinteger0–10000000.
Errors
400Unknown source; one of …
curl -X PUT 'https://api.cactive.com.au/v1/platform/flight-sources/{sourceId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"enabled": true,
"sortOrder": 0,
"use": "all"
}'Response 200
{
source: {
createdAt?: number
updatedAt?: number
sourceId: string
enabled?: boolean
sortOrder?: number
use?: "all" | "last_resort"
dailyRequests?: number
monthlyRequests?: number
}
}/ v1/ platform/ deploysMaps: Admin's "SMS for Maps alerts" switch (the maps.sms row, off by default). Off, the notifications service sends no Maps alert by text or call (docs/platform/notifications.md → Maps texts); containers see a change within 30 seconds.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/deploys' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
stages: {
[key: string]: {
commit: string
at: number
}
}
updatedAt: null | number
}/ v1/ platform/ maps/ smsThe SMS for Maps alerts switch (settings.on, off by default) and when and by whom it last changed. Off, no Maps alert texts or calls anyone. Platform staff only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/maps/sms' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
on: boolean
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ maps/ smsTurns SMS for Maps alerts on or off (on). Applies within 30 seconds; saved text choices on watches, zones and people's settings are kept. Audited. Platform staff only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
onbooleanrequired
Errors
403This switch is changed by people.
curl -X PUT 'https://api.cactive.com.au/v1/platform/maps/sms' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"on": true
}'Response 200
{
settings: {
on: boolean
}
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ incident-sourcesMaps: the emergency feeds the incidents poller reads, in order (rows: the seed's until one is saved), the parsers it knows (formats) and how each feed did last (status, from the live picture). The poller reads them within the cache TTL.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/incident-sources' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
sources: {
url: string
format: string
label: string
state: string
attribution: string
sourceId: string
enabled: boolean
sortOrder: number
pollSeconds: number
licence: string
licenceUrl?: string
homepage?: string
dedupe: boolean
}[]
saved: boolean
formats: {
id: string
label: string
}[]
status: {
sourceId: string
label: string
state: "ACT" | "NSW" | "NT" | "QLD" | "SA" | "TAS" | "VIC" | "WA" | "AU"
attribution: string
licence: string
licenceUrl?: string
homepage?: string
count: number
ok: boolean
checkedAt?: number
changedAt?: number
error?: string
}[]
updatedAt: null | number
}/ v1/ platform/ incident-sources/ :sourceIdAdds or changes an emergency feed: label, parser (format), https URL, state, order, on or off, poll interval (30–3,600 s), credit line, licence and the agency's page. The first save also writes the seed's other feeds so they stay in use.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
sourceIdADS-B source id (
adsblol,adsbfi,adsbexchange, …).
Request body
labelstringrequired1–80 characters. Trimmed.
formatstringrequiredUp to 40 characters.
urlstringrequiredUp to 1,000 characters. URL.
state"ACT" | "NSW" | "NT" | "QLD" | "SA" | "TAS" | "VIC" | "WA" | "AU"requiredenabledbooleanDefault
true.sortOrderintegerDefault
0.pollSecondsintegerDefault
60. 30–3600.attributionstringrequired1–300 characters. Trimmed.
licencestringrequired1–120 characters. Trimmed.
licenceUrlstringUp to 500 characters. URL.
homepagestringUp to 500 characters. URL.
dedupebooleanDefault
true.
Errors
400Invalid id: lowercase letters, digits and hyphens.400Unknown format; one of …400Feeds are read over https.
curl -X PUT 'https://api.cactive.com.au/v1/platform/incident-sources/{sourceId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"label": "Example",
"format": "example",
"url": "https://example.com",
"state": "ACT",
"attribution": "example",
"licence": "example"
}'Response 200
{
source: {
url: string
format: string
label: string
createdAt?: number
updatedAt?: number
state: string
attribution: string
sourceId: string
enabled?: boolean
sortOrder?: number
pollSeconds?: number
licence: string
licenceUrl?: string
homepage?: string
dedupe?: boolean
}
}/ v1/ platform/ incident-sources/ :sourceIdRemoves an emergency feed. Its incidents leave the map at the next poll without alerting anyone.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
sourceIdADS-B source id (
adsblol,adsbfi,adsbexchange, …).
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/incident-sources/{sourceId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ platform/ limitsMaps: aircraft presets watches target ({ kind: "preset", value: <presetId> }), e.g. police and emergency callsigns. Targets are hex, registration, callsign or type, * for prefixes. The poller reads them within the cache TTL.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/limits' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
limits: {
value: null | number
updatedAt: null | number
id: string
group: string
label: string
description?: string
default: number
min: number
max: number
step?: number
}[]
}/ v1/ platform/ limits/ :limitIdSets a limit (null: back to its default). Readers see it within a minute.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
limitIdA limit's id, e.g.
mirage.discord.historyMax.
Request body
valuenumberrequiredor null
Errors
400…: between … and …….404Unknown limit
curl -X PUT 'https://api.cactive.com.au/v1/platform/limits/{limitId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"value": 1
}'Response 200
{
limit: {
value: null | number
updatedAt: number
id: string
group: string
label: string
description?: string
default: number
min: number
max: number
step?: number
}
}/ v1/ platform/ marketing/ sms-pricesWhat a Marketing text part costs per destination (currency, prices of prefix, country, perPart): the prices in force, the built-in ones, and whether any are stored. Platform staff (platform:admin).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/marketing/sms-prices' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
prices: {
currency: string
prices: {
prefix: string
country: string
perPart: number
}[]
}
defaults: {
currency: string
prices: {
prefix: string
country: string
perPart: number
}[]
}
stored: boolean
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ marketing/ sms-pricesReplaces the text prices (prices; null puts the built-in ones back). Journeys' text steps show costs from them within a minute. Audited. Platform staff.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
pricesobjectrequiredor nullprices.currencystringrequiredMatches
^[A-Z]{3}$.prices.pricesobject[]requiredUp to 300 items.
prices.prices[].prefixstringrequiredMatches
^\+[1-9]\d{0,5}$.prices.prices[].countrystringrequired1–60 characters. Trimmed.
prices.prices[].perPartnumberrequired0–5.
curl -X PUT 'https://api.cactive.com.au/v1/platform/marketing/sms-prices' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"prices": {
"currency": "example",
"prices": [
{
"prefix": "example",
"country": "example",
"perPart": 1
}
]
}
}'Response 200
{
prices: {
currency: string
prices: {
prefix: string
country: string
perPart: number
}[]
}
defaults: {
currency: string
prices: {
prefix: string
country: string
perPart: number
}[]
}
stored: boolean
updatedAt: null | number
updatedBy: null | string
}/ v1/ platform/ aircraft-presetsAircraft presets flight watches can target ({ kind: "preset", value: <presetId> }): label, targets ({ kind: hex | registration | callsign | type, value }, * for prefixes), enabled, sortOrder.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/aircraft-presets' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
presets: {
targets: unknown
label: string
createdAt?: number
updatedAt?: number
enabled?: boolean
sortOrder?: number
presetId: string
}[]
}/ v1/ platform/ aircraft-presets/ :presetIdCreates or replaces an aircraft preset (label, targets, enabled, sortOrder). Watches that use it pick it up within a minute.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
presetIdAircraft preset id (lowercase letters, digits,
-and_); undervideo-presets, a video export preset's id (h264-1080p).
Request body
labelstringrequired1–64 characters. Trimmed.
targetsobject[]required1–200 items.
targets[].kind"hex" | "registration" | "callsign" | "type"requiredtargets[].valuestringrequired1–16 characters. Matches
^[A-Za-z0-9~*-]+$. Trimmed.enabledbooleanDefault
true.sortOrderintegerDefault
0.
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/aircraft-presets/{presetId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"label": "Example",
"targets": [
{
"kind": "hex",
"value": "example"
}
]
}'Response 200
{
preset: {
targets: {
kind: "type" | "hex" | "callsign" | "registration"
value: string
}[]
label: string
createdAt?: number
updatedAt?: number
enabled?: boolean
sortOrder?: number
presetId: string
}
}/ v1/ platform/ aircraft-presets/ :presetIdRemoves an aircraft preset; watches that named it stop matching through it.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
presetIdAircraft preset id (lowercase letters, digits,
-and_); undervideo-presets, a video export preset's id (h264-1080p).
Errors
400Invalid id: lowercase letters, digits and hyphens.404Preset not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/aircraft-presets/{presetId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ platform/ mail-category-rulesRules that sort received mail into inbox categories, in order: match (domain, local, subject or header), value, category (primary, transactions, updates, promotions), enabled, sortOrder.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/mail-category-rules' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
rules: {
value: string
createdAt?: number
updatedAt?: number
match: "header" | "subject" | "domain" | "local"
ruleId: string
category: "primary" | "transactions" | "updates" | "promotions"
enabled?: boolean
sortOrder?: number
}[]
}/ v1/ platform/ mail-category-rules/ testClassifies a pasted message with the saved rules, exactly as delivery would for a sender the mailbox doesn't know: pasted headers (or a whole message), or From and Subject.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
headersstringUp to 64,000 characters.
fromstringUp to 320 characters.
subjectstringUp to 998 characters.
Also checked: Paste headers, or give a From address or a subject.
curl -X POST 'https://api.cactive.com.au/v1/platform/mail-category-rules/test' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"headers": "example",
"from": "example",
"subject": "Example"
}'Response 200
{
result: {
category: "primary" | "transactions" | "updates" | "promotions"
reason: string
from: string
subject: string
domain: string
local: string
bulk: boolean
rule?: {
ruleId: string
match: "header" | "subject" | "domain" | "local"
value: string
category: "primary" | "transactions" | "updates" | "promotions"
enabled: boolean
sortOrder: number
}
}
}/ v1/ platform/ mail-category-rules/ :ruleIdCreates or replaces a mail category rule. Mail received from then on (within a minute) follows it; mail already received keeps its category.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
ruleIdRule id: a storage lifecycle rule (as returned by the settings or lifecycle routes), an issue automation rule (
rul_…) or a Mirage AutoMod rule (mar_…).
Request body
match"domain" | "local" | "subject" | "header"requiredvaluestringrequired1–120 characters. Trimmed. Lowercased.
category"primary" | "transactions" | "updates" | "promotions"requiredenabledbooleanDefault
true.sortOrderintegerDefault
0.
Errors
400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/mail-category-rules/{ruleId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"match": "domain",
"value": "example",
"category": "primary"
}'Response 200
{
rule: {
value: string
createdAt?: number
updatedAt?: number
match: "header" | "subject" | "domain" | "local"
ruleId: string
category: "primary" | "transactions" | "updates" | "promotions"
enabled?: boolean
sortOrder?: number
}
}/ v1/ platform/ mail-category-rules/ :ruleIdRemoves a mail category rule.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
ruleIdRule id: a storage lifecycle rule (as returned by the settings or lifecycle routes), an issue automation rule (
rul_…) or a Mirage AutoMod rule (mar_…).
Errors
400Invalid id: lowercase letters, digits and hyphens.404Rule not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/mail-category-rules/{ruleId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ platform/ mail-lendsMail domains lent out of the shared platform zone, each with its org and how far Mail has got with it (Admin → Mail → Lent Domains; docs/mail/README.md → Lent domains). parent: the name this stage lends under.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
curl 'https://api.cactive.com.au/v1/platform/mail-lends' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
parent: string
lends: {
mail: null | {
status: "error" | "active" | "pending" | "verifying"
orgId: string
}
createdAt?: number
updatedAt?: number
orgId: string
domain: string
purpose: string
addedBy: string
addedByLabel?: string
}[]
}/ v1/ platform/ mail-lendsLends one name to one org for Mail. Never replaces a lend: take it back first.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Request body
domainstringrequiredUp to 253 characters. Trimmed. Lowercased.
orgIdstringrequired1–64 characters. Trimmed.
purposestringrequired1–200 characters. Trimmed.
Errors
400No organisation has that id.409… is already a Mail domain.409… is lent already.
curl -X POST 'https://api.cactive.com.au/v1/platform/mail-lends' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"domain": "example",
"orgId": "<orgId>",
"purpose": "example"
}'Response 201
{
lend: {
createdAt?: number
updatedAt?: number
orgId: string
domain: string
purpose: string
addedBy: string
addedByLabel?: string
}
}/ v1/ platform/ mail-lends/ :domainTakes a lend back once its org no longer has the domain in Mail (removing it there deletes its records).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
domainThe mail domain, e.g.
example.com.
Errors
404Lend not found409The organisation still has … in Mail. It's removed in Mail → Settings → Domains first, which deletes its records.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/mail-lends/{domain}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ platform/ flight-coverage/ :areaIdRemoves a standing coverage area.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- platform:admin in the platform organisation
Path parameters
areaIdStanding coverage area id.
Errors
400Invalid id: lowercase letters, digits and hyphens.404Coverage area not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/flight-coverage/{areaId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}