API reference
Health, identity and locations
curl 'https://api.cactive.com.au/health'Response 200
{
ok: true
}/ health/ deepLiveness check including a read of the serving region's database replica; returns the region. No authentication.
- Auth
- None.
curl 'https://api.cactive.com.au/health/deep'Response 200
{
ok: true
region: string
dbMs: number
}/ v1/ hooks/ people/ :userId/ avatarA person's avatar for <img src> anywhere: a redirect to the image (good for an hour), cached for ten minutes; 404 when they have none. The avatarUrl in profiles carries a version (?v=), so a new image is a new URL. No authentication.
- Auth
- None.
Path parameters
userIdA member's user id (
usr_…).
curl 'https://api.cactive.com.au/v1/hooks/people/{userId}/avatar'/ v1/ meThe caller: the signed-in user (with organizations and roles), or the key (API or platform agent key) with its organization and scopes.
- Auth
- A person's token or an API key, as Authorization: Bearer.
curl 'https://api.cactive.com.au/v1/me' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
type: "agent"
id: string
orgId: string
scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write" | "vehicles:read" | "vehicles:write" | "vehicles:control" | "vehicles:admin" | "sharing:read" | "sharing:write")[]
name?: string
userId?: string
creatorRole?: "owner" | "admin" | "developer" | "viewer"
personal?: {
kind: "photos"
scopes: string[]
}
bot?: {
appId: string
}
} | {
userId: string
email: string
name?: string
avatarUrl?: string
locale?: string
orgs: {
id: string
slug: string
name?: string
kind: "platform" | "customer"
role: "owner" | "admin" | "developer" | "viewer"
teams?: string[]
scopes?: string[]
guest?: boolean
pending?: {
requirement: "mfa" | "passkey" | "method"
until: number
}
was?: string[]
}[]
held: {
id: string
slug: string
name?: string
reason: "blocked" | "guest_expired" | "mfa_required" | "passkey_required" | "method_not_allowed" | "reauthenticate" | "session_too_old"
was?: string[]
}[]
isPlatformAdmin: boolean
type: string
}/ v1/ localesThe languages people can choose (locales: locale, label, spelling, weekStart), in order: English (Australia), the default, and English (US). Choose one with PATCH /v1/me/profile (locale).
- Auth
- A person's token or an API key, as Authorization: Bearer.
curl 'https://api.cactive.com.au/v1/locales' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
locales: {
locale: string
label: string
spelling: "au" | "us"
weekStart: number
}[]
}/ v1/ me/ org-accessYour organizations whose Cactive One access has ended (never subscribed, cancelled or unpaid), with the reason for each ({ ended: { [orgId]: reason } }). Their apps answer 402 with code: "access_ended" until an administrator fixes billing.
- Auth
- A person's token or an API key, as Authorization: Bearer.
curl 'https://api.cactive.com.au/v1/me/org-access' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ended: {
[key: string]: "canceled" | "unpaid" | "setup"
}
}/ v1/ me/ permissionsWhat the person may do in a space, app by app (docs/specs/onboarding/permissions.md): space is personal or one of their organisations. Each app: whether they reach it, why not, their level (No access, View, Edit, Manage) and why, in words; in an organisation, also the apps it hides from everyone's app switcher (hidden, launcher keys), which they still reach.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
spacestringDefault
"personal".
curl 'https://api.cactive.com.au/v1/me/permissions' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
space: {
kind: "org" | "personal"
id: string
}
role?: "owner" | "admin" | "developer" | "viewer"
held?: "blocked" | "guest_expired" | "mfa_required" | "passkey_required" | "method_not_allowed" | "reauthenticate" | "session_too_old"
apps: {
app: "org" | "admin" | "calendar" | "cloud" | "git" | "chat" | "knowledge" | "mail" | "issues" | "maps" | "drive" | "photos" | "messaging" | "tenant" | "crm" | "health" | "weather" | "marketing" | "food" | "documents" | "sheets" | "slides" | "contacts" | "studio" | "video" | "vehicles" | "sharing"
label: string
reachable: boolean
reason?: "held" | "not_in_space" | "not_in_plan" | "access_ended" | "app_off" | "not_in_groups" | "no_access"
level: "none" | "edit" | "view" | "manage"
levelLabel: string
words: string
from?: string
}[]
scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write" | "vehicles:read" | "vehicles:write" | "vehicles:control" | "vehicles:admin" | "sharing:read" | "sharing:write")[]
hidden?: string[]
}/ v1/ locationsActive locations, for location pickers. Any authenticated caller.
- Auth
- A person's token or an API key, as Authorization: Bearer.
curl 'https://api.cactive.com.au/v1/locations' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
locations: {
locationId: string
label: string
isDefault: boolean
regions: string[]
region?: string
}[]
}/ v1/ me/ preferencesYour preferences, the same in every app and on every device: apps, the app switcher's order (order, tile keys such as cloud or mail:contacts) and the apps you hid (hidden), or null for the default switcher. People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Preferences belong to people.403Change preferences in the app.
curl 'https://api.cactive.com.au/v1/me/preferences' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
apps: null | {
order: string[]
hidden: string[]
}
}/ v1/ me/ preferencesSaves your app switcher (apps: { order, hidden }, up to 100 keys each; apps added later appear at the end). apps: null restores the default. People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
appsobjectrequiredor nullapps.orderstring[]requiredUp to 100 items. Each matches
^[a-z0-9][a-z0-9:_-]{0,39}$.apps.hiddenstring[]requiredUp to 100 items. Each matches
^[a-z0-9][a-z0-9:_-]{0,39}$.
Errors
403Preferences belong to people.403Change preferences in the app.
curl -X PUT 'https://api.cactive.com.au/v1/me/preferences' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"apps": {
"order": [
"example"
],
"hidden": [
"example"
]
}
}'Response 200
{
apps: null | {
order: string[]
hidden: string[]
}
}/ v1/ me/ preferences/ widgetsThe phone's widgets: what the Dynamic Island and the Lock Screen show, ranked per surface; null until the person arranges them.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Preferences belong to people.403Change preferences in the app.
curl 'https://api.cactive.com.au/v1/me/preferences/widgets' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
widgets: null | {
v: 1
items: {
id: string
kind: "counter"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
label: string
step: number
value: number
goal: number
}
} | {
id: string
kind: "device"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
show: "battery" | "memory" | "thermal" | "cpu"
}
} | {
id: string
kind: "endpoint"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
label: string
url: string
path: string
unit: string
decimals: null | number
refreshMinutes: number
}
} | {
id: string
kind: "weather"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
place: "saved" | "current"
placeId: string
name: string
lat: null | number
lon: null | number
units: "auto" | "metric" | "imperial"
}
} | {
id: string
kind: "vehicle"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
vehicleId: string
show: "charge" | "range"
unit: "km" | "mi"
}
} | {
id: string
kind: "photo"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
photos: string[]
rotate: "never" | "hourly" | "daily"
}
} | {
id: string
kind: "activity"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
metric: "steps" | "distance"
range: "today" | "week"
weekStartsOn: "monday" | "sunday"
unit: "km" | "mi"
goal: number
}
} | {
id: string
kind: "quote"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {}
} | {
id: string
kind: "countdown"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
label: string
target: "date" | "endOfDay" | "endOfWeek" | "endOfMonth" | "endOfYear"
at: null | number
repeat: "none" | "yearly"
weekStartsOn: "monday" | "sunday"
show: "auto" | "days"
photo: string
}
} | {
id: string
kind: "reminders"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
list: string
overdue: boolean
}
} | {
id: string
kind: "weekday"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
style: "short" | "long"
showDate: boolean
}
} | {
id: string
kind: "flight"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
radiusKm: number
}
} | {
id: string
kind: "dinner"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
picture: boolean
}
} | {
id: string
kind: "dayProgress"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
period: "month" | "day" | "year" | "week"
start: string
end: string
weekStartsOn: "monday" | "sunday"
show: "remaining" | "percent"
photo: string
}
} | {
id: string
kind: "pomodoro"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
focusMinutes: number
shortBreakMinutes: number
longBreakMinutes: number
sprintsPerLongBreak: number
autoStart: boolean
dailyGoal: number
}
} | {
id: string
kind: "stocks"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
symbols: string[]
mode: "fixed" | "carousel"
change: "amount" | "percent"
}
} | {
id: string
kind: "agenda"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
events: boolean
tasks: boolean
phoneCalendars: boolean
days: number
}
} | {
id: string
kind: "network"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
speedTest: boolean
sizeKb: number
}
} | {
id: string
kind: "stopwatch"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
label: string
}
} | {
id: string
kind: "shopping"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
count: number
}
} | {
id: string
kind: "progressBars"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
rows: {
label: string
source: string
color: "success" | "auto" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
max: number
}[]
weekStartsOn: "monday" | "sunday"
}
} | {
id: string
kind: "findmyPeople"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
count: number
}
} | {
id: string
kind: "findmyDevices"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
count: number
phones: boolean
cars: boolean
}
}[]
board: null | {
items: string[]
size: "small" | "medium" | "large"
}[]
island: {
enabled: boolean
order: string[]
}
lockScreen: {
enabled: boolean
order: string[]
maxItems: number
}
homeScreen: null | {
order: string[]
}
standBy: null | {
order: string[]
}
live: {
order: ("widgets" | "vehicles" | "flights" | "timers")[]
flights: "off" | "auto" | "maps" | "home"
vehicles: boolean
timers: boolean
}
}
}/ v1/ me/ preferences/ widgetsSaves the phone's widgets (at most 16 KB as JSON); every phone signed in to the account follows.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body (up to 20 KB)
widgetsobjectrequiredor nullwidgets.v1requiredwidgets.itemsobject[]requiredUp to 32 items.
widgets.items[].idstringrequiredMatches
^[a-z0-9][a-z0-9_-]{0,31}$.widgets.items[].kindstringrequiredUp to 32 characters.
widgets.items[].titlestringUp to 200 characters.
widgets.items[].tintstringUp to 32 characters.
widgets.items[].configobjectrequiredValues: any JSON.
widgets.islandobjectrequiredwidgets.island.enabledbooleanrequiredwidgets.island.orderstring[]requiredUp to 32 items. Each matches
^[a-z0-9][a-z0-9_-]{0,31}$.widgets.lockScreenobjectrequiredwidgets.lockScreen.enabledbooleanrequiredwidgets.lockScreen.orderstring[]requiredUp to 32 items. Each matches
^[a-z0-9][a-z0-9_-]{0,31}$.widgets.lockScreen.maxItemsintegerrequired1–4.
widgets.boardany JSON[]or nullUp to 32 items.
widgets.homeScreenobjector nullwidgets.homeScreen.orderstring[]requiredUp to 32 items. Each matches
^[a-z0-9][a-z0-9_-]{0,31}$.widgets.standByobjector nullwidgets.standBy.orderstring[]requiredUp to 32 items. Each matches
^[a-z0-9][a-z0-9_-]{0,31}$.widgets.liveobjectValues: any JSON.
Errors
403Preferences belong to people.403Change preferences in the app.
curl -X PUT 'https://api.cactive.com.au/v1/me/preferences/widgets' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"widgets": {
"v": 1,
"items": [
{
"id": "<id>",
"kind": "example",
"config": {}
}
],
"island": {
"enabled": true,
"order": [
"example"
]
},
"lockScreen": {
"enabled": true,
"order": [
"example"
],
"maxItems": 1
}
}
}'Response 200
{
widgets: null | {
v: 1
items: {
id: string
kind: "counter"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
label: string
step: number
value: number
goal: number
}
} | {
id: string
kind: "device"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
show: "battery" | "memory" | "thermal" | "cpu"
}
} | {
id: string
kind: "endpoint"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
label: string
url: string
path: string
unit: string
decimals: null | number
refreshMinutes: number
}
} | {
id: string
kind: "weather"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
place: "saved" | "current"
placeId: string
name: string
lat: null | number
lon: null | number
units: "auto" | "metric" | "imperial"
}
} | {
id: string
kind: "vehicle"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
vehicleId: string
show: "charge" | "range"
unit: "km" | "mi"
}
} | {
id: string
kind: "photo"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
photos: string[]
rotate: "never" | "hourly" | "daily"
}
} | {
id: string
kind: "activity"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
metric: "steps" | "distance"
range: "today" | "week"
weekStartsOn: "monday" | "sunday"
unit: "km" | "mi"
goal: number
}
} | {
id: string
kind: "quote"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {}
} | {
id: string
kind: "countdown"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
label: string
target: "date" | "endOfDay" | "endOfWeek" | "endOfMonth" | "endOfYear"
at: null | number
repeat: "none" | "yearly"
weekStartsOn: "monday" | "sunday"
show: "auto" | "days"
photo: string
}
} | {
id: string
kind: "reminders"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
list: string
overdue: boolean
}
} | {
id: string
kind: "weekday"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
style: "short" | "long"
showDate: boolean
}
} | {
id: string
kind: "flight"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
radiusKm: number
}
} | {
id: string
kind: "dinner"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
picture: boolean
}
} | {
id: string
kind: "dayProgress"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
period: "month" | "day" | "year" | "week"
start: string
end: string
weekStartsOn: "monday" | "sunday"
show: "remaining" | "percent"
photo: string
}
} | {
id: string
kind: "pomodoro"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
focusMinutes: number
shortBreakMinutes: number
longBreakMinutes: number
sprintsPerLongBreak: number
autoStart: boolean
dailyGoal: number
}
} | {
id: string
kind: "stocks"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
symbols: string[]
mode: "fixed" | "carousel"
change: "amount" | "percent"
}
} | {
id: string
kind: "agenda"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
events: boolean
tasks: boolean
phoneCalendars: boolean
days: number
}
} | {
id: string
kind: "network"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
speedTest: boolean
sizeKb: number
}
} | {
id: string
kind: "stopwatch"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
label: string
}
} | {
id: string
kind: "shopping"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
count: number
}
} | {
id: string
kind: "progressBars"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
rows: {
label: string
source: string
color: "success" | "auto" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
max: number
}[]
weekStartsOn: "monday" | "sunday"
}
} | {
id: string
kind: "findmyPeople"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
count: number
}
} | {
id: string
kind: "findmyDevices"
title?: string
tint?: "success" | "warning" | "brand" | "destructive" | "chart1" | "chart2" | "chart3" | "chart4" | "chart5"
config: {
count: number
phones: boolean
cars: boolean
}
}[]
board: null | {
items: string[]
size: "small" | "medium" | "large"
}[]
island: {
enabled: boolean
order: string[]
}
lockScreen: {
enabled: boolean
order: string[]
maxItems: number
}
homeScreen: null | {
order: string[]
}
standBy: null | {
order: string[]
}
live: {
order: ("widgets" | "vehicles" | "flights" | "timers")[]
flights: "off" | "auto" | "maps" | "home"
vehicles: boolean
timers: boolean
}
}
}/ v1/ me/ preferences/ calendarCalendar's settings (week start, working hours, other time zones, new-event defaults, overlays, hidden calendars); null until changed.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Preferences belong to people.403Change preferences in the app.
curl 'https://api.cactive.com.au/v1/me/preferences/calendar' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
calendar: null | {
weekStart: null | number
workStart: number
workEnd: number
workDays: number[]
zones: string[]
defaultReminder: null | number
defaultLength: number
showWeekends: boolean
showDeclined: boolean
showTasks: boolean
showBirthdays: boolean
hidden: string[]
defaultView: "month" | "day" | "year" | "week" | "agenda"
}
}/ v1/ me/ preferences/ calendarSaves Calendar's settings; the answer is what was saved (cleaned). Every device and the phone follow.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body (up to 16 KB)
calendarobjectrequiredor nullValues: any JSON.
Errors
403Preferences belong to people.403Change preferences in the app.413Too many settings to save.
curl -X PUT 'https://api.cactive.com.au/v1/me/preferences/calendar' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"calendar": {}
}'Response 200
{
calendar: null | {
weekStart: null | number
workStart: number
workEnd: number
workDays: number[]
zones: string[]
defaultReminder: null | number
defaultLength: number
showWeekends: boolean
showDeclined: boolean
showTasks: boolean
showBirthdays: boolean
hidden: string[]
defaultView: "month" | "day" | "year" | "week" | "agenda"
}
}/ v1/ me/ account/ devicesYour phones and tablets with the apps signed in on each (and whether each gets push), browsers, command-line machines and Apple devices' sign-ins; thisSession is the calling app's. Only you, in a phone app (a token with audience mobile); every change is audited in your organizations.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/devices' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
phones: {
installId: string
known: boolean
device: string
os?: string
place?: {
country?: string
city?: string
}
lastActiveAt: number
apps: {
sessionId: string
app?: string
appName: string
appVersion?: string
signedInAt: number
lastActiveAt: number
push: boolean
}[]
}[]
browsers: {
sessionId: string
method?: string
browser?: string
os?: string
model?: string
deviceKind?: string
ip?: string
firstIp?: string
country?: string
region?: string
city?: string
createdAt?: number
lastSeenAt?: number
}[]
cli: {
signedInAt: number
lastActiveAt: number
platform?: string
sessionId: string
machine: string
}[]
apple: {
grantId: string
orgId: string
deviceName: string
mailboxId: string
address?: string
createdAt?: number
lastUsedAt?: number
}[]
thisSession: null | string
}/ v1/ me/ account/ devices/ apps/ :sessionIdSigns one app on a phone out: its tokens stop at once and it stops receiving push. thisPhone says whether it was the calling app's own sign-in.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
sessionIdA sign-in's id (
cls_…for an app on a phone or the command line,ses_…for a browser), as the devices list gives it; under/v1/me/codea Code mode session (cds_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That app is already signed out.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/devices/apps/{sessionId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
thisPhone: boolean
}/ v1/ me/ account/ devices/ phones/ :installIdSigns every app on a phone out and removes its push registrations.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
installIdThe phone's install id (the same for every app on it).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404Nothing is signed in on that phone.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/devices/phones/{installId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
thisPhone: boolean
}/ v1/ me/ account/ devices/ browsers/ :sessionIdSigns a browser out, with the app sign-ins started from it.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
sessionIdA sign-in's id (
cls_…for an app on a phone or the command line,ses_…for a browser), as the devices list gives it; under/v1/me/codea Code mode session (cds_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That session already ended.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/devices/browsers/{sessionId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ devices/ cli/ :sessionIdSigns a command-line machine out and revokes the git keys it made (keysRevoked).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
sessionIdA sign-in's id (
cls_…for an app on a phone or the command line,ses_…for a browser), as the devices list gives it; under/v1/me/codea Code mode session (cds_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That machine is already signed out.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/devices/cli/{sessionId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
keysRevoked: number
}/ v1/ me/ account/ devices/ apple/ :grantIdSigns an Apple device out of Mail, Calendar and Contacts: its refresh token stops now, its access token within a minute.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
grantIdAn Apple device's sign-in (
exg_…), as the devices list gives it.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That device is already signed out.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/devices/apple/{grantId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ appleApple devices: your mailboxes, app passwords (never the secret), the devices that sync and the devices signed in with a profile.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/apple' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
mailboxes: {
mailboxId: string
orgId: string
orgName: string
address: string
displayName: string
}[]
passwords: {
appPasswordId: string
name: string
mailboxIds: string[]
createdAt: number
firstUsedAt?: number
lastUsedAt?: number
lastUsedBy?: string
expiresAt?: number
}[]
devices: {
deviceId: string
protocol: "eas" | "ews"
name: string
userAgent?: string
mailboxIds: string[]
appPasswordId?: string
firstSeenAt: number
lastSeenAt: number
wipeRequestedAt?: number
wipedAt?: number
}[]
signIns: {
grantId: string
orgId: string
deviceName: string
mailboxId: string
address?: string
createdAt?: number
lastUsedAt?: number
}[]
}/ v1/ me/ account/ apple/ passwordsMakes an app password (name, mailboxIds, empty for every mailbox, optional expiresInDays) after a fresh step-up for account_credential (403 step_up otherwise). The password is returned once.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
namestringrequired1–64 characters. Trimmed.
mailboxIdsstring[]requiredUp to 50 items. Each up to 64 characters.
expiresInDaysinteger0–3650.
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/apple/passwords' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"mailboxIds": [
"example"
]
}'Response 201
{
password: string
appPasswordId: string
}/ v1/ me/ account/ apple/ passwords/ :appPasswordIdRevokes an app password: devices using it are signed out within a minute.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
appPasswordIdAn app password's id (
apw_…), never the password.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That app password is already revoked.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/apple/passwords/{appPasswordId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ apple/ devices/ :deviceId/ wipeAsks an iPhone or iPad (ActiveSync) to remove this account's mail, calendars and contacts at its next sync (on: true), or withdraws that (on: false).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
deviceIdDevice id: an agent's (
dev_…); under/v1/me/notificationsa phone's install id; under/v1/me/sign-in-approvalsa phone that approves sign-ins (apd_…); under/v1/me/vaultthe id a device made for its vault (22 base64url characters).
Request body
onbooleanrequired
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404Only an iPhone or iPad set up with Exchange can remove the account.409There's nothing to withdraw: the device already removed the account, or wasn't asked to.
curl -X PUT 'https://api.cactive.com.au/v1/me/account/apple/devices/{deviceId}/wipe' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"on": true
}'Response 200
{
ok: true
}/ v1/ me/ account/ apple/ devices/ :deviceIdForgets a device and what it synced: its next sync starts over.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
deviceIdDevice id: an agent's (
dev_…); under/v1/me/notificationsa phone's install id; under/v1/me/sign-in-approvalsa phone that approves sign-ins (apd_…); under/v1/me/vaultthe id a device made for its vault (22 base64url characters).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That device is already forgotten.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/apple/devices/{deviceId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ ageYour date of birth (or null) and what it means for social features.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/age' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
birthDate: null | string
birthDateSource: null | "staff" | "self"
age: null | {
outcome: string
adult: boolean | null
method: string
recheckAfter: null | number
}
}/ v1/ me/ account/ ageSaves your date of birth (dateOfBirth, YYYY-MM-DD) once; after that only support corrects it (409).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
dateOfBirthstringrequiredUp to 10 characters.
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X PUT 'https://api.cactive.com.au/v1/me/account/age' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"dateOfBirth": "example"
}'Response 200
{
birthDate: null | string
birthDateSource: null | "staff" | "self"
age: null | {
outcome: string
adult: boolean | null
method: string
recheckAfter: null | number
}
}/ v1/ me/ account/ orgs/ :orgIdAn organization you belong to: its members with their roles, and its groups with their people and whether you may change them (the organization's owners and admins, and the group's own owners).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
orgIdOrganization id (
org_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404You aren't in that organisation.
curl 'https://api.cactive.com.au/v1/me/account/orgs/{orgId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
org: {
orgId: string
slug: string
name: string
kind: "platform" | "customer"
role: "owner" | "admin" | "developer" | "viewer"
}
members: {
guest?: boolean
userId: string
email: null | string
name: null | string
role: "owner" | "admin" | "developer" | "viewer"
}[]
groups: {
members: {
userId: string
role: "owner" | "member"
}[]
canManage: boolean
description?: string
teamId: string
name: string
}[]
}/ v1/ me/ account/ orgs/ :orgId/ groups/ :teamId/ members/ :userIdAdds a member to a group or makes them an owner or member of it (role). The group's owners and the organization's owners and admins; what the group grants is checked too.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
orgIdOrganization id (
org_…).teamIdGroup id (
team_…).userIdA member's user id (
usr_…).
Request body
role"owner" | "member"required
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.403Only the group's owners and the organisation's admins change who's in it.404You aren't in that organisation.404Organization not found404Group not found404Not a member of this organization
curl -X PUT 'https://api.cactive.com.au/v1/me/account/orgs/{orgId}/groups/{teamId}/members/{userId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"role": "owner"
}'Response 200
{
ok: true
}/ v1/ me/ account/ orgs/ :orgId/ groups/ :teamId/ members/ :userIdTakes a member out of a group (the group's owners and the organization's owners and admins).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
orgIdOrganization id (
org_…).teamIdGroup id (
team_…).userIdA member's user id (
usr_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.403Only the group's owners and the organisation's admins change who's in it.404You aren't in that organisation.404Organization not found404Group not found404Not a member of this organization
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/orgs/{orgId}/groups/{teamId}/members/{userId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ sign-insThe last 90 days of sign-ins and failed attempts, newest first: device, place, address, how, and whether the browser is still signed in.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/sign-ins' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
days: number
entries: {
eventId: string
at: number
result: "success" | "failure"
device: string
kind: "mobile" | "other" | "desktop" | "tablet"
place?: string
ip?: string
how?: string
reason?: string
apple?: boolean
session?: "active" | "ended" | "current"
sessionId?: string
}[]
}/ v1/ me/ account/ permissionsPersonal and each organisation: what the person can do in each app and why, and what Caity can do for them there.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/permissions' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
spaces: {
id: string
kind: "org" | "personal"
name: string
slug?: string
role?: "owner" | "admin" | "developer" | "viewer"
view: {
space: {
kind: "org" | "personal"
id: string
}
role?: "owner" | "admin" | "developer" | "viewer"
held?: "blocked" | "guest_expired" | "mfa_required" | "passkey_required" | "method_not_allowed" | "reauthenticate" | "session_too_old"
apps: {
app: "org" | "admin" | "calendar" | "cloud" | "git" | "chat" | "knowledge" | "mail" | "issues" | "maps" | "drive" | "photos" | "messaging" | "tenant" | "crm" | "health" | "weather" | "marketing" | "food" | "documents" | "sheets" | "slides" | "contacts" | "studio" | "video" | "vehicles" | "sharing"
label: string
reachable: boolean
reason?: "held" | "not_in_space" | "not_in_plan" | "access_ended" | "app_off" | "not_in_groups" | "no_access"
level: "none" | "edit" | "view" | "manage"
levelLabel: string
words: string
from?: string
}[]
scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write" | "vehicles:read" | "vehicles:write" | "vehicles:control" | "vehicles:admin" | "sharing:read" | "sharing:write")[]
hidden?: string[]
}
caity: {
enabled: boolean
reason?: string
mode: "ask" | "reads" | "app" | "auto"
modeLabel: string
maxMode: "ask" | "reads" | "app" | "auto"
apps: {
app: "cloud" | "git" | "maps" | "drive" | "photos" | "tenant" | "crm" | "health" | "weather" | "marketing" | "food" | "documents" | "sheets" | "slides" | "video" | "vehicles" | "mirage" | "brain" | "tasks" | "connectors" | "agents"
platform: "org" | "admin" | "calendar" | "cloud" | "git" | "chat" | "knowledge" | "mail" | "issues" | "maps" | "drive" | "photos" | "messaging" | "tenant" | "crm" | "health" | "weather" | "marketing" | "food" | "documents" | "sheets" | "slides" | "contacts" | "studio" | "video" | "vehicles" | "sharing"
label: string
reachable: boolean
words: string
}[]
}
}[]
}/ v1/ me/ account/ first-runThe account's first run as this phone app shows it (?app=, the app's id): due, its steps, the invites waiting, how the person signs in.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
appstringDefault
"home".
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/first-run' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
run: null | {
startedAt: number
done: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
skipped: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
completedAt?: number
pausedAt?: number
dismissedAt?: number
}
due: boolean
steps: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
name?: string
invites: {
inviteId: string
orgId: string
orgName: string
role: string
guest: boolean
invitedBy?: string
}[]
ways: string[]
secured: boolean
}/ v1/ me/ account/ first-run/ steps/ :stepContinue (done) or Skip on one of the first run's steps.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
stepA first-run step as
@cactive/core/first-runfirstRunStepsnames it, such asapps.
Request body
outcome"done" | "skipped"required
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404There's no such step.
curl -X POST 'https://api.cactive.com.au/v1/me/account/first-run/steps/{step}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"outcome": "done"
}'Response 200
{
run: {
startedAt: number
done: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
skipped: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
completedAt?: number
pausedAt?: number
dismissedAt?: number
}
}/ v1/ me/ account/ first-run/ later"Finish later": sign-ins stop showing the first run; Account offers to pick it up.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/first-run/later' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
run: null | {
pausedAt: number
startedAt: number
done: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
skipped: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
completedAt?: number
dismissedAt?: number
}
}/ v1/ me/ account/ first-run/ dismissAccount's "Get Set Up" card: Not Now (the card goes; the run stays).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/first-run/dismiss' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
run: null | {
dismissedAt: number
startedAt: number
done: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
skipped: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
completedAt?: number
pausedAt?: number
}
}/ v1/ me/ account/ first-run/ invites/ :inviteId/ joinJoins an organisation from an invite to the person's proved address (the Organisation step), audited in it.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
inviteIdInvite id (
inv_…); undervehicles, Tesla's id for a driver invitation, as the drivers list gives it.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/first-run/invites/{inviteId}/join' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
joined: {
orgId: string
orgName: string
role: "owner" | "admin" | "developer" | "viewer"
}
run: null | {
startedAt: number
done: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
skipped: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
completedAt?: number
pausedAt?: number
dismissedAt?: number
}
}/ v1/ me/ account/ joinJoins an organisation with a join code (code: as typed, or its link) at the code's role; the first run's Organisation step is then done. Every code that doesn't work gets the same answer; a person may try 10 an hour (429 after).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
codestringrequired1–200 characters.
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/join' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"code": "example"
}'Response 200
{
joined: {
orgId: string
orgName: string
role: "owner" | "admin" | "developer" | "viewer"
}
run: null | {
startedAt: number
done: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
skipped: ("apps" | "phone" | "secure" | "welcome" | "organisation" | "bring" | "connect")[]
completedAt?: number
pausedAt?: number
dismissedAt?: number
}
}/ v1/ me/ account/ connected-appsApps you allowed to act for you (MCP clients, organizations' own apps), with their permissions and last use.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/connected-apps' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
apps: {
orgName?: string
clientId: string
name: string
kind: "project" | "dynamic"
orgId?: string
scopes: string[]
lastUsedAt?: number
createdAt?: number
}[]
}/ v1/ me/ account/ connected-apps/ :clientIdRemoves a connected app and its refresh tokens: it stops reaching your account at once.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
clientIdSign-in client id (
cli_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That app is already removed.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/connected-apps/{clientId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ passkeysYour passkeys: name, when added and last used. Never the public key.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/passkeys' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
passkeys: {
credentialId: string
name?: string
transports?: string[]
createdAt?: number
lastUsedAt?: number
}[]
}/ v1/ me/ account/ passkeys/ :credentialIdRemoves a passkey. 409 when it's your only way in (no password and no other passkey). Passkeys are added at ID.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
credentialIdA passkey's credential id, as the passkeys list gives it.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That passkey is already removed.409This is your only way to sign in. Set a password or add another passkey first.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/passkeys/{credentialId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ linked-sign-insYour Apple and Google sign-ins: the address (or that it's hidden), when linked and last used, and lastWay, the one that's your only way in. Never the provider's account id.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/linked-sign-ins' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
links: {
provider: "apple" | "google"
email?: string
privateEmail: boolean
linkedAt?: number
lastUsedAt?: number
}[]
lastWay: null | "apple" | "google"
}/ v1/ me/ account/ linked-sign-ins/ :providerUnlinks apple or google. 409 when it's your only way in (no password, passkey or other link). Linking happens at ID.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
providerGIF provider:
klipyorgiphy.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That isn't a sign-in we know.404… isn't linked.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/linked-sign-ins/{provider}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ passwordWhether your account has a password (hasPassword).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/password' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
hasPassword: boolean
}/ v1/ me/ account/ passwordSets a new password (12 to 256 characters); with one already set, current must be it (wrong ones count toward the sign-in lockout, 429 while locked); a first one needs a fresh step-up for account_credential (403 step_up otherwise; the app confirms at ID's /step-up/phone). Every other sign-in ends (signedOut); this app stays.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
currentstringUp to 256 characters.
passwordstringrequired12–256 characters.
Also checked: Unknown fields are rejected.
Errors
400That isn't your current password.403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.403Your account isn't active.429Too many wrong passwords. Try again in … minute….
curl -X PUT 'https://api.cactive.com.au/v1/me/account/password' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"password": "example"
}'Response 200
{
ok: true
signedOut: {
browsers: number
apps: number
commandLine: number
}
}/ v1/ me/ account/ phonesYour phone numbers (verified or not, primary, notifications on), the most you may add (max) and whether two-step sign-in by text is on.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/phones' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
phones: {
display: string
number: string
label?: string
createdAt?: number
verifiedAt?: number
primary?: boolean
phoneId: string
verifiedBy?: "code" | "operator"
notifications?: boolean
}[]
max: number
twoStep: boolean
}/ v1/ me/ account/ phonesAdds a number (number, optional label) and texts it a code; sent: false with a reason when the text couldn't go.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
numberstringrequired3–32 characters.
labelstringUp to 40 characters. Trimmed.
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/phones' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"number": "example"
}'Response 200
{
reason?: string
phone: {
display: string
number: string
label?: string
createdAt?: number
verifiedAt?: number
primary?: boolean
phoneId: string
verifiedBy?: "code" | "operator"
notifications?: boolean
}
sent: boolean
}/ v1/ me/ account/ phones/ verifyVerifies the number a code went to (code).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
codestringrequired4–10 characters. Trimmed.
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/phones/verify' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"code": "example"
}'Response 200
{
ok: true
display: string
}/ v1/ me/ account/ phones/ :phoneId/ resendTexts a new code to an unverified number (once every 30 seconds, five an hour).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
phoneIdOne of your phone numbers (
phn_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/phones/{phoneId}/resend' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
to: string
}/ v1/ me/ account/ phones/ :phoneIdRemoves a number. Removing the last verified one turns two-step sign-in by text off.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
phoneIdOne of your phone numbers (
phn_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/phones/{phoneId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ phones/ :phoneId/ primaryMakes a verified number the primary one: texts, calls and sign-in codes go to it.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
phoneIdOne of your phone numbers (
phn_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X PUT 'https://api.cactive.com.au/v1/me/account/phones/{phoneId}/primary' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ account/ phones/ :phoneId/ notificationsWhether a number gets notification texts and calls (on).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
phoneIdOne of your phone numbers (
phn_…).
Request body
onbooleanrequired
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X PUT 'https://api.cactive.com.au/v1/me/account/phones/{phoneId}/notifications' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"on": true
}'Response 200
{
ok: true
}/ v1/ me/ account/ two-step/ codeTexts a code to your primary number, to turn two-step sign-in by text on or off.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
400Verify a number first.403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X POST 'https://api.cactive.com.au/v1/me/account/two-step/code' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
to: string
}/ v1/ me/ account/ two-stepTurns two-step sign-in by text on or off (on) with the texted code.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
onbooleanrequiredcodestringrequired4–10 characters. Trimmed.
Also checked: Unknown fields are rejected.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X PUT 'https://api.cactive.com.au/v1/me/account/two-step' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"on": true,
"code": "example"
}'Response 200
{
ok: true
twoStep: boolean
}/ v1/ me/ account/ assistantCaity by phone: your settings, whether a PIN is set and a number verified, and each organization with the permissions your role there lets the assistant hold (scopes, with their words) and its defaults.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/assistant' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
orgs: {
orgId: string
name: string
role: "owner" | "admin" | "developer" | "viewer"
scopes: {
scope: string
label: string
}[]
defaults: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write" | "vehicles:read" | "vehicles:write" | "vehicles:control" | "vehicles:admin" | "sharing:read" | "sharing:write")[]
}[]
maxOrgs: number
number?: string
assistant: {
enabled: boolean
orgs: {
orgId: string
scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write" | "vehicles:read" | "vehicles:write" | "vehicles:control" | "vehicles:admin" | "sharing:read" | "sharing:write")[]
}[]
defaultOrgId?: string
sms: boolean
voice: boolean
pinForActions: boolean
saveTranscripts: "none" | "issues" | "brain"
issuesSpace?: string
retentionDays: 7 | 90 | 30
briefingAt?: string
}
hasPin: boolean
hasPhone: boolean
}/ v1/ me/ account/ assistantSaves Caity by phone: on or off, the organizations it acts in with their permissions (never more than your role allows), the default organization, texts and calls, the PIN for calls, transcripts, retention and the briefing time.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
enabledbooleanrequiredorgsobject[]requiredUp to 50 items.
orgs[].orgIdstringrequiredUp to 64 characters.
orgs[].scopesstring[]requiredUp to 80 items. Each up to 64 characters.
defaultOrgIdstringor nullUp to 64 characters.
smsbooleanrequiredvoicebooleanrequiredpinForActionsbooleanrequiredsaveTranscripts"brain" | "issues" | "none"requiredissuesSpacestringor nullUp to 10 characters. Trimmed.
retentionDays7 | 30 | 90requiredbriefingAtstringor nullMatches
^([01]\d|2[0-3]):[0-5]\d$.
Also checked: Unknown fields are rejected.
Errors
400Turn on at least one organisation.400At most 20 organisations.400Choose at least one permission for …, or turn it off.400Set a PIN first, or turn off asking for it.403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X PUT 'https://api.cactive.com.au/v1/me/account/assistant' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"enabled": true,
"orgs": [
{
"orgId": "<orgId>",
"scopes": [
"example"
]
}
],
"sms": true,
"voice": true,
"pinForActions": true,
"saveTranscripts": "brain",
"retentionDays": 7
}'Response 200
{
assistant: {
enabled: boolean
orgs: {
orgId: string
scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write" | "vehicles:read" | "vehicles:write" | "vehicles:control" | "vehicles:admin" | "sharing:read" | "sharing:write")[]
}[]
defaultOrgId?: string
sms: boolean
voice: boolean
pinForActions: boolean
saveTranscripts: "none" | "issues" | "brain"
issuesSpace?: string
retentionDays: 7 | 90 | 30
briefingAt?: string
}
}/ v1/ me/ account/ assistant/ pinSets the PIN for calls (pin, confirm): 4 to 8 digits, not all the same or in a row.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
pinstringrequiredUp to 16 characters.
confirmstringrequiredUp to 16 characters.
Also checked: Unknown fields are rejected.
Errors
400The PINs don't match.400Use 4 to 8 digits that aren't all the same or in a row.403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl -X PUT 'https://api.cactive.com.au/v1/me/account/assistant/pin' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"pin": "example",
"confirm": "example"
}'Response 200
{
ok: true
}/ v1/ me/ account/ encryption-keysYour own encryption keys (Health, your Drive and Photos) with their use in the last 30 days. Metadata only, never material.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/encryption-keys' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
keys: {
uses30d: number
lastUsedAt: null | number
keyId: string
name: string
description: null | string
app: "keys" | "drive" | "health" | "vehicles" | "secrets" | "connectors" | "integrations" | "vehicles-tesla"
appLabel: string
protects: string
scope: {
kind: "org" | "project" | "person" | "environment" | "space" | "vehicle"
id: string
}
owner: "org" | "person"
algorithm: "aes-256-gcm" | "ed25519" | "ecdsa-p256" | "s3"
state: "disabled" | "enabled" | "destroyed"
currentVersion: number
managed: boolean
createdAt: number
rotatedAt: null | number
rotateEveryDays: null | number
nextRotationAt: null | number
destroyedAt: null | number
canRotate: boolean
}[]
}/ v1/ me/ account/ encryption-keys/ :keyIdOne of your keys: versions, use, and the last 50 events of what used it.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
keyIdKey id (
key_…).
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404No such key.
curl 'https://api.cactive.com.au/v1/me/account/encryption-keys/{keyId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
key: {
keyId: string
name: string
description: null | string
app: "keys" | "drive" | "health" | "vehicles" | "secrets" | "connectors" | "integrations" | "vehicles-tesla"
appLabel: string
protects: string
scope: {
kind: "org" | "project" | "person" | "environment" | "space" | "vehicle"
id: string
}
owner: "org" | "person"
algorithm: "aes-256-gcm" | "ed25519" | "ecdsa-p256" | "s3"
state: "disabled" | "enabled" | "destroyed"
currentVersion: number
managed: boolean
createdAt: number
rotatedAt: null | number
rotateEveryDays: null | number
nextRotationAt: null | number
destroyedAt: null | number
canRotate: boolean
versions: {
version: number
createdAt: number
current: boolean
uses30d: number
adopted: boolean
}[]
uses30d: number
lastUsedAt: null | number
usage: {
day: string
uses: number
}[]
canReencrypt: boolean
jobs: {
error?: string
createdAt: number
kind: "reencrypt"
app: "keys" | "drive" | "health" | "vehicles" | "secrets" | "connectors" | "integrations" | "vehicles-tesla"
createdBy: string
keyId: string
total?: number
startedAt?: number
state: "queued" | "done" | "failed" | "running"
jobId: string
failed: number
seen: number
moved: number
finishedAt?: number
current: number
toVersion: number
}[]
}
activity: {
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
}
}/ v1/ me/ account/ photo-tokensPhotos' personal tokens (a Shortcut, Mac sync, MCP): name, scopes and last use. Never the token.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.
curl 'https://api.cactive.com.au/v1/me/account/photo-tokens' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
tokens: {
tokenId: string
name: string
scopes: string[]
createdAt: number
lastUsedAt?: number
expiresAt?: number
}[]
}/ v1/ me/ account/ photo-tokens/ :tokenIdRemoves a Photos token: whatever uses it stops at once.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
tokenIdPhoto token id (
pht_…), not the token itself.
Errors
403Your account belongs to you.403Change your account yourself, in the app.403Manage your account from the phone app or at your account page.404That token is already removed.
curl -X DELETE 'https://api.cactive.com.au/v1/me/account/photo-tokens/{tokenId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ me/ profileYou: your profile (name, email, avatarUrl, bannerUrl, banner and accent colours, about (your About Me), effect, username, kind (personal, or org for an account made through an organization's invite) and usernameChangeAt (when it can change next, or null), locale (the language you chose, or null)), the language to use (locale: your choice, else en-US for a US Accept-Language, else en-AU), the languages you can choose (locales) and each organization with your scopes there, so native apps offer only the organizations an app can open. People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403A personal session is required.
curl 'https://api.cactive.com.au/v1/me/profile' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
user: {
userId: string
name: string
avatarUrl: null | string
bannerUrl: null | string
banner: null | string
accent: null | string
about: null | string
effect: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
username: null | string
kind: "org" | "personal"
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
}
}[]
email: string
usernameChangeAt: null | number
showBadges: boolean
ownBadges: {
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
}
}[]
locale: null | string
effectChoice: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
effectsIncluded: boolean
}
locale: string
locales: {
locale: string
label: string
spelling: "au" | "us"
weekStart: number
}[]
orgs: {
scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write" | "vehicles:read" | "vehicles:write" | "vehicles:control" | "vehicles:admin" | "sharing:read" | "sharing:write")[]
was?: string[]
guest?: true
id: string
slug: string
name?: string
kind: "platform" | "customer"
role: "owner" | "admin" | "developer" | "viewer"
}[]
}/ v1/ me/ profileChanges your profile, the one people see across the platform (Mirage's cards, members and messages; every app's account menu): name, about (About Me, Markdown as in Mirage), banner and accent (hex colours such as #5865f2) effect (a profile effect's id from GET /v1/me/profile/effects; choosing one needs a paid plan, Cactive One Pro or Max or a paid organisation seat, else 403) and locale (your language for dates, numbers and spelling in every app, email and text: one of GET /v1/locales, such as en-AU or en-US). null clears a field (not the name). Returns user and the fields that changed; name changes are recorded in your organizations' audit logs. People only, not assistants.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
namestringUp to 100 characters.
aboutstringor nullUp to 190 characters.
bannerstringor nullMatches
^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$.accentstringor nullMatches
^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$.effectstringor nullUp to 40 characters.
localestringor nullUp to 20 characters.
showBadgesboolean
Also checked: Unknown fields are rejected.
Errors
403A personal session is required.403Change your profile in the app.
curl -X PATCH 'https://api.cactive.com.au/v1/me/profile' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"about": "example",
"banner": "example"
}'Response 200
{
user: {
userId: string
name: string
avatarUrl: null | string
bannerUrl: null | string
banner: null | string
accent: null | string
about: null | string
effect: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
username: null | string
kind: "org" | "personal"
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
}
}[]
email: string
createdAt: number
usernameChangeAt: null | number
showBadges: boolean
ownBadges: {
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
}
}[]
locale: null | string
effectChoice: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
effectsIncluded: boolean
}
changed: ("name" | "avatar" | "bannerImage" | "banner" | "accent" | "about" | "effect" | "username" | "locale" | "showBadges")[]
}/ v1/ me/ profile/ avatar/ uploadsWhere to upload a new avatar: give its type (PNG, JPEG, WebP or GIF) and size in bytes (up to 2 MB). PUT the image to url with headers within 15 minutes (exactly that type and size), then make it your avatar with PUT /v1/me/profile/avatar. People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
type"image/png" | "image/jpeg" | "image/webp" | "image/gif"requiredsizeintegerrequired1–2097152.
Also checked: Unknown fields are rejected.
Errors
403A personal session is required.403Change your profile in the app.
curl -X POST 'https://api.cactive.com.au/v1/me/profile/avatar/uploads' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"type": "image/png",
"size": 1
}'Response 201
{
uploadId: string
url: string
headers: {
"content-type": "image/png" | "image/jpeg" | "image/webp" | "image/gif"
}
expiresAt: number
}/ v1/ me/ profile/ avatarMakes an uploaded image (uploadId) your avatar once it's checked: there, up to 2 MB and really a PNG, JPEG, WebP or GIF, whatever it was uploaded as. Anything else is deleted (400 or 413). The previous image is deleted. Returns user with the new avatarUrl. People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
uploadIdstringrequiredMatches
^avt_[0-9a-z]{26}$.
Also checked: Unknown fields are rejected.
Errors
403A personal session is required.403Change your profile in the app.
curl -X PUT 'https://api.cactive.com.au/v1/me/profile/avatar' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"uploadId": "<uploadId>"
}'Response 200
{
user: {
userId: string
name: string
avatarUrl: null | string
bannerUrl: null | string
banner: null | string
accent: null | string
about: null | string
effect: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
username: null | string
kind: "org" | "personal"
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
}
}[]
email: string
createdAt: number
usernameChangeAt: null | number
showBadges: boolean
ownBadges: {
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
}
}[]
locale: null | string
effectChoice: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
effectsIncluded: boolean
}
changed: ("name" | "avatar" | "bannerImage" | "banner" | "accent" | "about" | "effect" | "username" | "locale" | "showBadges")[]
}/ v1/ me/ profile/ avatarRemoves your avatar (people see your initials) and deletes the image. People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403A personal session is required.403Change your profile in the app.
curl -X DELETE 'https://api.cactive.com.au/v1/me/profile/avatar' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
user: {
userId: string
name: string
avatarUrl: null | string
bannerUrl: null | string
banner: null | string
accent: null | string
about: null | string
effect: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
username: null | string
kind: "org" | "personal"
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
}
}[]
email: string
createdAt: number
usernameChangeAt: null | number
showBadges: boolean
ownBadges: {
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
}
}[]
locale: null | string
effectChoice: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
effectsIncluded: boolean
}
changed: ("name" | "avatar" | "bannerImage" | "banner" | "accent" | "about" | "effect" | "username" | "locale" | "showBadges")[]
}/ v1/ me/ profile/ effectsThe profile effects (effects: effectId, name, renderer, colors), in order. Choosing and showing one need a paid plan: GET /v1/me/profile says whether you have one (effectsIncluded) and which you chose (effectChoice), kept while it isn't shown. People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403A personal session is required.403Change your profile in the app.
curl 'https://api.cactive.com.au/v1/me/profile/effects' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
effects: {
effectId: string
name: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}[]
}/ v1/ me/ profile/ username/ checkWhether a username (name) could be yours: available, or the reason it can't (taken, reserved, or not 2–32 lowercase letters, numbers, underscores and single full stops). People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
namestringrequiredUp to 64 characters.
Errors
403A personal session is required.403Change your profile in the app.
curl 'https://api.cactive.com.au/v1/me/profile/username/check?name=Example' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
username: string
available: boolean
reason: null | string
}/ v1/ me/ profile/ usernameClaims or changes your username (username, unique regardless of case). After a change the next waits 30 days (429); your previous name is held for you for 14 days. Accounts made through an organization's invite have none (403); a taken name is 409. Recorded in your organizations' audit logs. People only, not assistants.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
usernamestringrequiredUp to 64 characters.
Also checked: Unknown fields are rejected.
Errors
403A personal session is required.403Change your profile in the app.
curl -X PUT 'https://api.cactive.com.au/v1/me/profile/username' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"username": "Example"
}'Response 200
{
user: {
userId: string
name: string
avatarUrl: null | string
bannerUrl: null | string
banner: null | string
accent: null | string
about: null | string
effect: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
username: null | string
kind: "org" | "personal"
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
}
}[]
email: string
createdAt: number
usernameChangeAt: null | number
showBadges: boolean
ownBadges: {
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
}
}[]
locale: null | string
effectChoice: null | {
id: string
renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
colors: string[]
}
effectsIncluded: boolean
}
changed: ("name" | "avatar" | "bannerImage" | "banner" | "accent" | "about" | "effect" | "username" | "locale" | "showBadges")[]
}