API reference

Health, identity and locations

Liveness, the caller's identity and the active locations.
GET/health

Liveness check. No authentication.

Auth
None.
curl 'https://api.cactive.com.au/health'
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/health/deep

Liveness 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'
Send it from this page with your session or a key.

Response 200

{
  ok: true
  region: string
  dbMs: number
}
GET/v1/hooks/people/:userId/avatar

A 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

  • userId

    A member's user id (usr_…).

curl 'https://api.cactive.com.au/v1/hooks/people/{userId}/avatar'
Send it from this page with your session or a key.
GET/v1/hooks/people/:userId/banner

A person's banner image for <img src> anywhere, as the avatar's hook: a redirect to the image, cached for ten minutes; 404 when they have none. bannerUrl carries a version. No authentication.

Auth
None.

Path parameters

  • userId

    A member's user id (usr_…).

curl 'https://api.cactive.com.au/v1/hooks/people/{userId}/banner'
Send it from this page with your session or a key.
GET/v1/me

The 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.
Get an API key
curl 'https://api.cactive.com.au/v1/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
}
GET/v1/locales

The 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.
Get an API key
curl 'https://api.cactive.com.au/v1/locales' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  locales: {
    locale: string
    label: string
    spelling: "au" | "us"
    weekStart: number
  }[]
}
GET/v1/me/org-access

Your 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.
Get an API key
curl 'https://api.cactive.com.au/v1/me/org-access' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ended: {
    [key: string]: "canceled" | "unpaid" | "setup"
  }
}
GET/v1/me/permissions

What 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.
Get an API key

Query parameters

  • spacestring

    Default "personal".

curl 'https://api.cactive.com.au/v1/me/permissions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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[]
}
GET/v1/locations

Active locations, for location pickers. Any authenticated caller.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key
curl 'https://api.cactive.com.au/v1/locations' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  locations: {
    locationId: string
    label: string
    isDefault: boolean
    regions: string[]
    region?: string
  }[]
}
GET/v1/me/preferences

Your 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.
Get an API key

Errors

  • 403Preferences belong to people.
  • 403Change preferences in the app.
curl 'https://api.cactive.com.au/v1/me/preferences' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  apps: null | {
    order: string[]
    hidden: string[]
  }
}
PUT/v1/me/preferences

Saves 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.
Get an API key

Request body

  • appsobjectrequiredor null
  • apps.orderstring[]required

    Up to 100 items. Each matches ^[a-z0-9][a-z0-9:_-]{0,39}$.

  • apps.hiddenstring[]required

    Up 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"
      ]
    }
  }'
Send it from this page with your session or a key.

Response 200

{
  apps: null | {
    order: string[]
    hidden: string[]
  }
}
GET/v1/me/preferences/widgets

The 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.
Get an API key

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"
Send it from this page with your session or a key.

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
    }
  }
}
PUT/v1/me/preferences/widgets

Saves 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.
Get an API key

Request body (up to 20 KB)

  • widgetsobjectrequiredor null
  • widgets.v1required
  • widgets.itemsobject[]required

    Up to 32 items.

  • widgets.items[].idstringrequired

    Matches ^[a-z0-9][a-z0-9_-]{0,31}$.

  • widgets.items[].kindstringrequired

    Up to 32 characters.

  • widgets.items[].titlestring

    Up to 200 characters.

  • widgets.items[].tintstring

    Up to 32 characters.

  • widgets.items[].configobjectrequired

    Values: any JSON.

  • widgets.islandobjectrequired
  • widgets.island.enabledbooleanrequired
  • widgets.island.orderstring[]required

    Up to 32 items. Each matches ^[a-z0-9][a-z0-9_-]{0,31}$.

  • widgets.lockScreenobjectrequired
  • widgets.lockScreen.enabledbooleanrequired
  • widgets.lockScreen.orderstring[]required

    Up to 32 items. Each matches ^[a-z0-9][a-z0-9_-]{0,31}$.

  • widgets.lockScreen.maxItemsintegerrequired

    1–4.

  • widgets.boardany JSON[]or null

    Up to 32 items.

  • widgets.homeScreenobjector null
  • widgets.homeScreen.orderstring[]required

    Up to 32 items. Each matches ^[a-z0-9][a-z0-9_-]{0,31}$.

  • widgets.standByobjector null
  • widgets.standBy.orderstring[]required

    Up to 32 items. Each matches ^[a-z0-9][a-z0-9_-]{0,31}$.

  • widgets.liveobject

    Values: 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
      }
    }
  }'
Send it from this page with your session or a key.

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
    }
  }
}
GET/v1/me/preferences/calendar

Calendar'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.
Get an API key

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"
Send it from this page with your session or a key.

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"
  }
}
PUT/v1/me/preferences/calendar

Saves 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.
Get an API key

Request body (up to 16 KB)

  • calendarobjectrequiredor null

    Values: 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": {}
  }'
Send it from this page with your session or a key.

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"
  }
}
GET/v1/me/account/devices

Your 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/devices' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
}
DELETE/v1/me/account/devices/apps/:sessionId

Signs 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.
Get an API key

Path parameters

  • sessionId

    A 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/code a 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
  thisPhone: boolean
}
DELETE/v1/me/account/devices/phones/:installId

Signs every app on a phone out and removes its push registrations.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • installId

    The 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
  thisPhone: boolean
}
DELETE/v1/me/account/devices/browsers/:sessionId

Signs a browser out, with the app sign-ins started from it.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • sessionId

    A 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/code a 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
DELETE/v1/me/account/devices/cli/:sessionId

Signs 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.
Get an API key

Path parameters

  • sessionId

    A 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/code a 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
  keysRevoked: number
}
DELETE/v1/me/account/devices/apple/:grantId

Signs 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.
Get an API key

Path parameters

  • grantId

    An 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/me/account/apple

Apple 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/apple' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
  }[]
}
POST/v1/me/account/apple/passwords

Makes 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.
Get an API key

Request body

  • namestringrequired

    1–64 characters. Trimmed.

  • mailboxIdsstring[]required

    Up to 50 items. Each up to 64 characters.

  • expiresInDaysinteger

    0–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"
    ]
  }'
Send it from this page with your session or a key.

Response 201

{
  password: string
  appPasswordId: string
}
DELETE/v1/me/account/apple/passwords/:appPasswordId

Revokes an app password: devices using it are signed out within a minute.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • appPasswordId

    An 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
PUT/v1/me/account/apple/devices/:deviceId/wipe

Asks 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.
Get an API key

Path parameters

  • deviceId

    Device id: an agent's (dev_…); under /v1/me/notifications a phone's install id; under /v1/me/sign-in-approvals a phone that approves sign-ins (apd_…); under /v1/me/vault the 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
  }'
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
DELETE/v1/me/account/apple/devices/:deviceId

Forgets a device and what it synced: its next sync starts over.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • deviceId

    Device id: an agent's (dev_…); under /v1/me/notifications a phone's install id; under /v1/me/sign-in-approvals a phone that approves sign-ins (apd_…); under /v1/me/vault the 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/me/account/age

Your date of birth (or null) and what it means for social features.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/age' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  birthDate: null | string
  birthDateSource: null | "staff" | "self"
  age: null | {
    outcome: string
    adult: boolean | null
    method: string
    recheckAfter: null | number
  }
}
PUT/v1/me/account/age

Saves 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.
Get an API key

Request body

  • dateOfBirthstringrequired

    Up 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"
  }'
Send it from this page with your session or a key.

Response 200

{
  birthDate: null | string
  birthDateSource: null | "staff" | "self"
  age: null | {
    outcome: string
    adult: boolean | null
    method: string
    recheckAfter: null | number
  }
}
GET/v1/me/account/orgs/:orgId

An 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.
Get an API key

Path parameters

  • orgId

    Organization 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"
Send it from this page with your session or a key.

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
  }[]
}
PUT/v1/me/account/orgs/:orgId/groups/:teamId/members/:userId

Adds 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • teamId

    Group id (team_…).

  • userId

    A 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 found
  • 404Group not found
  • 404Not 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"
  }'
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
DELETE/v1/me/account/orgs/:orgId/groups/:teamId/members/:userId

Takes 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • teamId

    Group id (team_…).

  • userId

    A 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 found
  • 404Group not found
  • 404Not 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/me/account/sign-ins

The 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/sign-ins' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
  }[]
}
GET/v1/me/account/permissions

Personal 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/permissions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
      }[]
    }
  }[]
}
GET/v1/me/account/first-run

The 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.
Get an API key

Query parameters

  • appstring

    Default "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"
Send it from this page with your session or a key.

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
}
POST/v1/me/account/first-run/steps/:step

Continue (done) or Skip on one of the first run's steps.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • step

    A first-run step as @cactive/core/first-run firstRunSteps names it, such as apps.

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"
  }'
Send it from this page with your session or a key.

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
  }
}
POST/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.
Get an API 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.
curl -X POST 'https://api.cactive.com.au/v1/me/account/first-run/later' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
  }
}
POST/v1/me/account/first-run/dismiss

Account'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.
Get an API 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.
curl -X POST 'https://api.cactive.com.au/v1/me/account/first-run/dismiss' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
  }
}
POST/v1/me/account/first-run/invites/:inviteId/join

Joins 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.
Get an API key

Path parameters

  • inviteId

    Invite id (inv_…); under vehicles, 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"
Send it from this page with your session or a key.

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
  }
}
POST/v1/me/account/join

Joins 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.
Get an API key

Request body

  • codestringrequired

    1–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"
  }'
Send it from this page with your session or a key.

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
  }
}
GET/v1/me/account/connected-apps

Apps 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/connected-apps' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  apps: {
    orgName?: string
    clientId: string
    name: string
    kind: "project" | "dynamic"
    orgId?: string
    scopes: string[]
    lastUsedAt?: number
    createdAt?: number
  }[]
}
DELETE/v1/me/account/connected-apps/:clientId

Removes 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.
Get an API key

Path parameters

  • clientId

    Sign-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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/me/account/passkeys

Your passkeys: name, when added and last used. Never the public key.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/passkeys' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  passkeys: {
    credentialId: string
    name?: string
    transports?: string[]
    createdAt?: number
    lastUsedAt?: number
  }[]
}
DELETE/v1/me/account/passkeys/:credentialId

Removes 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.
Get an API key

Path parameters

  • credentialId

    A 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/me/account/linked-sign-ins

Your 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/linked-sign-ins' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  links: {
    provider: "apple" | "google"
    email?: string
    privateEmail: boolean
    linkedAt?: number
    lastUsedAt?: number
  }[]
  lastWay: null | "apple" | "google"
}
DELETE/v1/me/account/linked-sign-ins/:provider

Unlinks 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.
Get an API key

Path parameters

  • provider

    GIF provider: klipy or giphy.

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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/me/account/password

Whether your account has a password (hasPassword).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/password' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  hasPassword: boolean
}
PUT/v1/me/account/password

Sets 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.
Get an API key

Request body

  • currentstring

    Up to 256 characters.

  • passwordstringrequired

    12–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"
  }'
Send it from this page with your session or a key.

Response 200

{
  ok: true
  signedOut: {
    browsers: number
    apps: number
    commandLine: number
  }
}
GET/v1/me/account/phones

Your 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/phones' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
}
POST/v1/me/account/phones

Adds 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.
Get an API key

Request body

  • numberstringrequired

    3–32 characters.

  • labelstring

    Up 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"
  }'
Send it from this page with your session or a key.

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
}
POST/v1/me/account/phones/verify

Verifies the number a code went to (code).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Request body

  • codestringrequired

    4–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"
  }'
Send it from this page with your session or a key.

Response 200

{
  ok: true
  display: string
}
POST/v1/me/account/phones/:phoneId/resend

Texts 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.
Get an API key

Path parameters

  • phoneId

    One 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
  to: string
}
DELETE/v1/me/account/phones/:phoneId

Removes 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.
Get an API key

Path parameters

  • phoneId

    One 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
PUT/v1/me/account/phones/:phoneId/primary

Makes 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.
Get an API key

Path parameters

  • phoneId

    One 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
PUT/v1/me/account/phones/:phoneId/notifications

Whether a number gets notification texts and calls (on).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • phoneId

    One 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
  }'
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
POST/v1/me/account/two-step/code

Texts 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.
Get an API key

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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
  to: string
}
PUT/v1/me/account/two-step

Turns 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.
Get an API key

Request body

  • onbooleanrequired
  • codestringrequired

    4–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"
  }'
Send it from this page with your session or a key.

Response 200

{
  ok: true
  twoStep: boolean
}
GET/v1/me/account/assistant

Caity 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/assistant' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
}
PUT/v1/me/account/assistant

Saves 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.
Get an API key

Request body

  • enabledbooleanrequired
  • orgsobject[]required

    Up to 50 items.

  • orgs[].orgIdstringrequired

    Up to 64 characters.

  • orgs[].scopesstring[]required

    Up to 80 items. Each up to 64 characters.

  • defaultOrgIdstringor null

    Up to 64 characters.

  • smsbooleanrequired
  • voicebooleanrequired
  • pinForActionsbooleanrequired
  • saveTranscripts"brain" | "issues" | "none"required
  • issuesSpacestringor null

    Up to 10 characters. Trimmed.

  • retentionDays7 | 30 | 90required
  • briefingAtstringor null

    Matches ^([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
  }'
Send it from this page with your session or a key.

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
  }
}
PUT/v1/me/account/assistant/pin

Sets 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.
Get an API key

Request body

  • pinstringrequired

    Up to 16 characters.

  • confirmstringrequired

    Up 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"
  }'
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/me/account/encryption-keys

Your 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/encryption-keys' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
  }[]
}
GET/v1/me/account/encryption-keys/:keyId

One 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.
Get an API key

Path parameters

  • keyId

    Key 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"
Send it from this page with your session or a key.

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
  }
}
GET/v1/me/account/photo-tokens

Photos' 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.
Get an API 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.
curl 'https://api.cactive.com.au/v1/me/account/photo-tokens' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  tokens: {
    tokenId: string
    name: string
    scopes: string[]
    createdAt: number
    lastUsedAt?: number
    expiresAt?: number
  }[]
}
DELETE/v1/me/account/photo-tokens/:tokenId

Removes a Photos token: whatever uses it stops at once.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • tokenId

    Photo 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/me/profile

You: 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.
Get an API key

Errors

  • 403A personal session is required.
curl 'https://api.cactive.com.au/v1/me/profile' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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"
  }[]
}
PATCH/v1/me/profile

Changes 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.
Get an API key

Request body

  • namestring

    Up to 100 characters.

  • aboutstringor null

    Up to 190 characters.

  • bannerstringor null

    Matches ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$.

  • accentstringor null

    Matches ^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$.

  • effectstringor null

    Up to 40 characters.

  • localestringor null

    Up 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"
  }'
Send it from this page with your session or a key.

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")[]
}
POST/v1/me/profile/avatar/uploads

Where 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.
Get an API key

Request body

  • type"image/png" | "image/jpeg" | "image/webp" | "image/gif"required
  • sizeintegerrequired

    1–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
  }'
Send it from this page with your session or a key.

Response 201

{
  uploadId: string
  url: string
  headers: {
    "content-type": "image/png" | "image/jpeg" | "image/webp" | "image/gif"
  }
  expiresAt: number
}
PUT/v1/me/profile/avatar

Makes 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.
Get an API key

Request body

  • uploadIdstringrequired

    Matches ^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>"
  }'
Send it from this page with your session or a key.

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")[]
}
DELETE/v1/me/profile/avatar

Removes your avatar (people see your initials) and deletes the image. People only.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

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"
Send it from this page with your session or a key.

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")[]
}
POST/v1/me/profile/banner/uploads

Where to upload a new banner image (cropped to 5:2, 1500 × 600, first): give its type (PNG, JPEG, WebP or GIF) and size in bytes (up to 4 MB). PUT the image to url with headers within 15 minutes, then make it your banner with PUT /v1/me/profile/banner. People only.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Request body

  • type"image/png" | "image/jpeg" | "image/webp" | "image/gif"required
  • sizeintegerrequired

    1–4194304.

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/banner/uploads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "image/png",
    "size": 1
  }'
Send it from this page with your session or a key.

Response 201

{
  uploadId: string
  url: string
  headers: {
    "content-type": "image/png" | "image/jpeg" | "image/webp" | "image/gif"
  }
  expiresAt: number
}
PUT/v1/me/profile/banner

Makes an uploaded image (uploadId) your banner once it's checked: there, up to 4 MB and really a PNG, JPEG, WebP or GIF. Anything else is deleted (400 or 413). The previous image is deleted. Returns user with the new bannerUrl. People only.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Request body

  • uploadIdstringrequired

    Matches ^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/banner' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "uploadId": "<uploadId>"
  }'
Send it from this page with your session or a key.

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")[]
}
DELETE/v1/me/profile/banner

Removes your banner image (your banner colour shows) and deletes the image. People only.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Errors

  • 403A personal session is required.
  • 403Change your profile in the app.
curl -X DELETE 'https://api.cactive.com.au/v1/me/profile/banner' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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")[]
}
GET/v1/me/profile/effects

The 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.
Get an API key

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"
Send it from this page with your session or a key.

Response 200

{
  effects: {
    effectId: string
    name: string
    renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
    colors: string[]
  }[]
}
GET/v1/me/profile/username/check

Whether 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.
Get an API key

Query parameters

  • namestringrequired

    Up 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"
Send it from this page with your session or a key.

Response 200

{
  username: string
  available: boolean
  reason: null | string
}
PUT/v1/me/profile/username

Claims 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.
Get an API key

Request body

  • usernamestringrequired

    Up 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"
  }'
Send it from this page with your session or a key.

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")[]
}