API reference

Platform administration

Organizations, plans, regions and locations, for platform administrators.
GET/v1/platform/analytics

Traffic across every customer deployment, with the busiest organizations.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:analytics in the platform organisation
Get an API key

Query parameters

  • range"24h" | "7d" | "30d" | "90d"

    Default "24h".

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

Response 200

{
  top: {
    hosts?: {
      key: string
      requests: number
      bytes: number
      name?: string
    }[]
    deployments?: {
      key: string
      requests: number
      bytes: number
      name?: string
    }[]
    paths?: {
      key: string
      requests: number
      bytes: number
      name?: string
    }[]
    orgs?: {
      key: string
      requests: number
      bytes: number
      name?: string
    }[]
    countries?: {
      key: string
      requests: number
      bytes: number
      name?: string
    }[]
    projects?: {
      key: string
      requests: number
      bytes: number
      name?: string
    }[]
  }
  unattributed: number
  updatedAt: null | number
  range: "24h" | "7d" | "30d" | "90d"
  step: number
  from: string
  to: string
  totals: {
    bytes: number
    requests: number
    s2xx: number
    s3xx: number
    s4xx: number
    s5xx: number
    hits: number
    misses: number
    p50: null | number
    p95: null | number
  }
  series: {
    bytes: number
    requests: number
    s2xx: number
    s3xx: number
    s4xx: number
    s5xx: number
    hits: number
    misses: number
    p50: null | number
    p95: null | number
    t: string
  }[]
}
GET/v1/platform/mail/usage

Mail sent and received per organization over the last days.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:analytics in the platform organisation
Get an API key

Query parameters

  • daysinteger

    Default 7. 1–31. Coerced from a string.

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

Response 200

{
  days: number
  total: {
    sent: number
    received: number
    bounced: number
    complained: number
  }
  orgs: {
    orgId: string
    sent: number
    received: number
    bounced: number
    complained: number
  }[]
}
GET/v1/platform/usage

Cost per organization for a month (month=YYYY-MM, default this month) from Cost Explorer, grouped by the si:org cost allocation tag, with each organization's Serverless App Services, repositories, databases and buckets, deployment requests and bytes, and mail sent and received in the month. Spend without the tag is untagged.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Query parameters

  • monthstring

    Matches ^\d{4}-(0[1-9]|1[0-2])$.

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

Response 200

{
  month: string
  currency: string
  estimated: boolean
  costError?: string
  orgs: {
    projects: number
    repositories: number
    databases: number
    buckets: number
    requests: null | number
    bytes: null | number
    mailSent: null | number
    mailReceived: null | number
    orgId: string
    name: string
    slug: string
    kind: "platform" | "customer"
    planId?: string
    cost: null | number
  }[]
  untagged: null | number
  otherOrgs: null | number
}
POST/v1/platform/coverage/runs

Records a test coverage run of the platform's repository: its commit, branch, pipeline run and each workspace's tests, line, branch and function coverage, least covered and untested files. Totals are worked out from the workspaces. Kept 90 days. Needs platform:coverage (the nightly pipeline's key).

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:coverage in the platform organisation
Get an API key

Request body

  • version1required
  • commitstring

    Matches ^[0-9a-f]{7,64}$.

  • branchstring

    1–255 characters.

  • runUrlstring

    Up to 2,000 characters. URL.

  • source"ci" | "local"required
  • startedAtintegerrequired

    > 0.

  • finishedAtintegerrequired

    > 0.

  • packagesobject[]required

    1–300 items.

  • packages[].namestringrequired

    1–214 characters.

  • packages[].dirstringrequired

    Up to 200 characters. Matches ^[A-Za-z0-9][A-Za-z0-9._-]*(\/[A-Za-z0-9._-]+)*$.

  • packages[].status"passed" | "failed" | "error"required
  • packages[].testsobjectrequired
  • packages[].tests.totalintegerrequired

    0–100000000.

  • packages[].tests.passedintegerrequired

    0–100000000.

  • packages[].tests.failedintegerrequired

    0–100000000.

  • packages[].tests.skippedintegerrequired

    0–100000000.

  • packages[].tests.todointegerrequired

    0–100000000.

  • packages[].tests.cancelledintegerrequired

    0–100000000.

  • packages[].durationMsintegerrequired

    0–100000000.

  • packages[].linesobjectrequired
  • packages[].lines.totalintegerrequired

    0–100000000.

  • packages[].lines.coveredintegerrequired

    0–100000000.

  • packages[].branchesobjectrequired
  • packages[].branches.totalintegerrequired

    0–100000000.

  • packages[].branches.coveredintegerrequired

    0–100000000.

  • packages[].functionsobjectrequired
  • packages[].functions.totalintegerrequired

    0–100000000.

  • packages[].functions.coveredintegerrequired

    0–100000000.

  • packages[].filesobjectrequired
  • packages[].files.loadedintegerrequired

    0–100000000.

  • packages[].files.sourceintegerrequired

    0–100000000.

  • packages[].leastCoveredobject[]required

    Up to 25 items.

  • packages[].leastCovered[].pathstringrequired

    1–500 characters.

  • packages[].leastCovered[].linesobjectrequired
  • packages[].leastCovered[].lines.totalintegerrequired

    0–100000000.

  • packages[].leastCovered[].lines.coveredintegerrequired

    0–100000000.

  • packages[].leastCovered[].branchesobjectrequired
  • packages[].leastCovered[].branches.totalintegerrequired

    0–100000000.

  • packages[].leastCovered[].branches.coveredintegerrequired

    0–100000000.

  • packages[].leastCovered[].functionsobjectrequired
  • packages[].leastCovered[].functions.totalintegerrequired

    0–100000000.

  • packages[].leastCovered[].functions.coveredintegerrequired

    0–100000000.

  • packages[].untestedstring[]required

    Up to 50 items. Each 1–500 characters.

  • packages[].errorstring

    Up to 2,000 characters.

  • packages[].cachedboolean
  • totalsany JSON

Errors

  • 503The table is busy; try again.
curl -X POST 'https://api.cactive.com.au/v1/platform/coverage/runs' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "version": 1,
    "source": "ci",
    "startedAt": 1,
    "finishedAt": 1,
    "packages": [
      {
        "name": "Example",
        "dir": "example",
        "status": "passed",
        "tests": {
          "total": 1,
          "passed": 1,
          "failed": 1,
          "skipped": 1,
          "todo": 1,
          "cancelled": 1
        },
        "durationMs": 1,
        "lines": {
          "total": 1,
          "covered": 1
        },
        "branches": {
          "total": 1,
          "covered": 1
        },
        "functions": {
          "total": 1,
          "covered": 1
        },
        "files": {
          "loaded": 1,
          "source": 1
        },
        "leastCovered": [
          {
            "path": "example",
            "lines": {
              "total": 1,
              "covered": 1
            },
            "branches": {
              "total": 1,
              "covered": 1
            },
            "functions": {
              "total": 1,
              "covered": 1
            }
          }
        ],
        "untested": [
          "example"
        ]
      }
    ]
  }'
Send it from this page with your session or a key.

Response 201

{
  runId: string
}
GET/v1/platform/coverage/latest

The latest coverage run's id, commit and start, so a pipeline can skip a commit it already reported. Needs platform:coverage or platform:admin.

Auth
A person's token or an API key, as Authorization: Bearer.
Scopes
platform:coverage (for the pipeline's key), platform:admin (for Admin)
Get an API key

Errors

  • 403Missing scope …
curl 'https://api.cactive.com.au/v1/platform/coverage/latest' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  run: null | {
    runId: string
    commit: null | string
    startedAt: number
  }
}
GET/v1/platform/coverage

Coverage runs of the last 90 days (newest first) with their totals, a run's workspaces (run=, default the latest) and the workspaces of the run before it, for changes.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Query parameters

  • runstring

    Up to 64 characters.

Errors

  • 404No such run
curl 'https://api.cactive.com.au/v1/platform/coverage' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  runs: {
    branch?: string
    source: "local" | "ci"
    startedAt: number
    commit?: string
    finishedAt: number
    totals: {
      lines: {
        total: number
        covered: number
      }
      branches: {
        total: number
        covered: number
      }
      functions: {
        total: number
        covered: number
      }
      tests: {
        total: number
        passed: number
        failed: number
        skipped: number
        todo: number
        cancelled: number
      }
      durationMs: number
      packages: number
      failedPackages: number
    }
    runUrl?: string
    runId: string
  }[]
  run: null | {
    branch?: string
    source: "local" | "ci"
    startedAt: number
    commit?: string
    finishedAt: number
    totals: {
      lines: {
        total: number
        covered: number
      }
      branches: {
        total: number
        covered: number
      }
      functions: {
        total: number
        covered: number
      }
      tests: {
        total: number
        passed: number
        failed: number
        skipped: number
        todo: number
        cancelled: number
      }
      durationMs: number
      packages: number
      failedPackages: number
    }
    runUrl?: string
    runId: string
  }
  packages: {
    error?: string
    name: string
    status: "error" | "failed" | "passed"
    durationMs: number
    dir: string
    files: {
      loaded: number
      source: number
    }
    lines: {
      total: number
      covered: number
    }
    tests: {
      total: number
      passed: number
      failed: number
      skipped: number
      todo: number
      cancelled: number
    }
    cached?: boolean
    branches: {
      total: number
      covered: number
    }
    functions: {
      total: number
      covered: number
    }
  }[]
  previous: null | {
    runId: string
    packages: {
      error?: string
      name: string
      status: "error" | "failed" | "passed"
      durationMs: number
      dir: string
      files: {
        loaded: number
        source: number
      }
      lines: {
        total: number
        covered: number
      }
      tests: {
        total: number
        passed: number
        failed: number
        skipped: number
        todo: number
        cancelled: number
      }
      cached?: boolean
      branches: {
        total: number
        covered: number
      }
      functions: {
        total: number
        covered: number
      }
    }[]
  }
}
GET/v1/platform/coverage/runs/:runId/package

One workspace of a coverage run (dir=services/api) with its least covered loaded files and the source files no test loaded.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • runId

    Coverage run id (cov_…).

Query parameters

  • dirany JSONrequired

Errors

  • 404No such workspace in this run
curl 'https://api.cactive.com.au/v1/platform/coverage/runs/{runId}/package?dir=%7B%7D' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  package: {
    lines: {
      total: number
      covered: number
    }
    branches: {
      total: number
      covered: number
    }
    functions: {
      total: number
      covered: number
    }
    name: string
    dir: string
    status: "error" | "failed" | "passed"
    tests: {
      total: number
      passed: number
      failed: number
      skipped: number
      todo: number
      cancelled: number
    }
    durationMs: number
    files: {
      loaded: number
      source: number
    }
    leastCovered: {
      lines: {
        total: number
        covered: number
      }
      branches: {
        total: number
        covered: number
      }
      functions: {
        total: number
        covered: number
      }
      path: string
    }[]
    untested: string[]
    error?: string
    cached?: boolean
  }
}
GET/v1/platform/mirage/social/settings

Mirage's social limits and ranking weights: what's stored, the settings in force and the defaults. Platform staff (platform:admin).

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

Response 200

{
  stored: {
    postLength?: number
    mediaPerPost?: number
    imageBytes?: number
    videoBytes?: number
    editWindowMinutes?: number
    editsPerPost?: number
    postsPerHour?: number
    followsPerDay?: number
    maxFollowing?: number
    fanoutMaxFollowers?: number
    fanoutBatch?: number
    feedDays?: number
    storyHours?: number
    notificationDays?: number
    ranking?: {
      follows: number
      sharesServer: number
      affinity: number
      affinityCap: number
      engagement: number
      likedByFollowee: number
      popular: number
      notInterestedAuthor: number
      notInterestedTag: number
      halfLifeHours: number
    }
    blockedWords?: string[]
  }
  settings: {
    postLength: number
    mediaPerPost: number
    imageBytes: number
    videoBytes: number
    editWindowMinutes: number
    editsPerPost: number
    postsPerHour: number
    followsPerDay: number
    maxFollowing: number
    fanoutMaxFollowers: number
    fanoutBatch: number
    feedDays: number
    storyHours: number
    notificationDays: number
    ranking: {
      follows: number
      sharesServer: number
      affinity: number
      affinityCap: number
      engagement: number
      likedByFollowee: number
      popular: number
      notInterestedAuthor: number
      notInterestedTag: number
      halfLifeHours: number
    }
    blockedWords: string[]
  }
  defaults: {
    postLength: number
    mediaPerPost: number
    imageBytes: number
    videoBytes: number
    editWindowMinutes: number
    editsPerPost: number
    postsPerHour: number
    followsPerDay: number
    maxFollowing: number
    fanoutMaxFollowers: number
    fanoutBatch: number
    feedDays: number
    storyHours: number
    notificationDays: number
    ranking: {
      follows: number
      sharesServer: number
      affinity: number
      affinityCap: number
      engagement: number
      likedByFollowee: number
      popular: number
      notInterestedAuthor: number
      notInterestedTag: number
      halfLifeHours: number
    }
    blockedWords: string[]
  }
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/mirage/social/settings

Changes social settings (any of postLength, mediaPerPost, imageBytes, videoBytes, editWindowMinutes, editsPerPost, postsPerHour, followsPerDay, maxFollowing, fanoutMaxFollowers, fanoutBatch, feedDays, storyHours, notificationDays, ranking, blockedWords; null restores a default). Applies within a minute. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key
curl -X PUT 'https://api.cactive.com.au/v1/platform/mirage/social/settings' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  stored: {
    postLength?: number
    mediaPerPost?: number
    imageBytes?: number
    videoBytes?: number
    editWindowMinutes?: number
    editsPerPost?: number
    postsPerHour?: number
    followsPerDay?: number
    maxFollowing?: number
    fanoutMaxFollowers?: number
    fanoutBatch?: number
    feedDays?: number
    storyHours?: number
    notificationDays?: number
    ranking?: {
      follows: number
      sharesServer: number
      affinity: number
      affinityCap: number
      engagement: number
      likedByFollowee: number
      popular: number
      notInterestedAuthor: number
      notInterestedTag: number
      halfLifeHours: number
    }
    blockedWords?: string[]
  }
  settings: {
    postLength: number
    mediaPerPost: number
    imageBytes: number
    videoBytes: number
    editWindowMinutes: number
    editsPerPost: number
    postsPerHour: number
    followsPerDay: number
    maxFollowing: number
    fanoutMaxFollowers: number
    fanoutBatch: number
    feedDays: number
    storyHours: number
    notificationDays: number
    ranking: {
      follows: number
      sharesServer: number
      affinity: number
      affinityCap: number
      engagement: number
      likedByFollowee: number
      popular: number
      notInterestedAuthor: number
      notInterestedTag: number
      halfLifeHours: number
    }
    blockedWords: string[]
  }
  defaults: {
    postLength: number
    mediaPerPost: number
    imageBytes: number
    videoBytes: number
    editWindowMinutes: number
    editsPerPost: number
    postsPerHour: number
    followsPerDay: number
    maxFollowing: number
    fanoutMaxFollowers: number
    fanoutBatch: number
    feedDays: number
    storyHours: number
    notificationDays: number
    ranking: {
      follows: number
      sharesServer: number
      affinity: number
      affinityCap: number
      engagement: number
      likedByFollowee: number
      popular: number
      notInterestedAuthor: number
      notInterestedTag: number
      halfLifeHours: number
    }
    blockedWords: string[]
  }
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/mirage/social/age/:userId

Records an age check by hand (appeals, testing): outcome 16_plus or under_16 and an optional note. Under 16 deactivates their Feed (hidden from everyone, kept) until a later check says 16 or over. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • userId

    A member's user id (usr_…).

Errors

  • 400outcome is 16_plus or under_16.
  • 403Age checks are recorded by people.
curl -X PUT 'https://api.cactive.com.au/v1/platform/mirage/social/age/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ageAssurance: {
    outcome: "16_plus" | "under_16"
    adult?: boolean
    method: "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
    provider: string
    reference?: string
    checkedAt: number
    recheckAfter?: number
  }
}
DELETE/v1/platform/mirage/social/posts/:postId

Removes a post (reason: one of the report reasons, or a few words); its author is told why. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • postId

    A Feed post id (pst_…).

Query parameters

  • reasonstring

Errors

  • 403Posts are removed by people.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/mirage/social/posts/{postId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/platform/mirage/competition/circuits

Every closed circuit on the leaderboards' list, enabled or not, with its boundary, start/finish line and length. Platform staff.

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

Response 200

{
  circuits: {
    circuitId: string
    name: string
    region: string
    boundary: [number, number][]
    gate: [[number, number], [number, number]]
    lengthKm: number
    enabled: boolean
    verified: boolean
    notes: null | string
    updatedAt: null | number
  }[]
}
PUT/v1/platform/mirage/competition/circuits/:circuitId

Adds or changes a circuit: name, region, boundary ([lat, lon] points around the track and no public road), gate (the start/finish line, two points), lengthKm, verified, enabled (only once verified), optional notes. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • circuitId

    A closed circuit's id (lower case with dashes, phillip-island).

curl -X PUT 'https://api.cactive.com.au/v1/platform/mirage/competition/circuits/{circuitId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  circuit: {
    circuitId: string
    name: string
    region: string
    boundary: [number, number][]
    gate: [[number, number], [number, number]]
    lengthKm: number
    enabled: boolean
    verified: boolean
  }
}
DELETE/v1/platform/mirage/competition/circuits/:circuitId

Deletes a circuit. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • circuitId

    A closed circuit's id (lower case with dashes, phillip-island).

curl -X DELETE 'https://api.cactive.com.au/v1/platform/mirage/competition/circuits/{circuitId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/platform/mirage/competition/factors

The factors behind leaderboards' CO₂, charging shares and smoothness: a petrol car's grams per km, the grid's grams per kWh, off-peak and solar hours, and the smoothness thresholds. Platform staff.

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

Response 200

{
  factors: {
    iceGramsPerKm: number
    gridGramsPerKwh: number
    offPeak: {
      from: number
      to: number
    }
    solarHours: {
      from: number
      to: number
    }
    gentleLong: number
    gentleLat: number
    harshLong: number
    harshLat: number
  }
}
PUT/v1/platform/mirage/competition/factors

Changes the factors (all of them). Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key
curl -X PUT 'https://api.cactive.com.au/v1/platform/mirage/competition/factors' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  factors: {
    iceGramsPerKm: number
    gridGramsPerKwh: number
    offPeak: {
      from: number
      to: number
    }
    solarHours: {
      from: number
      to: number
    }
    gentleLong: number
    gentleLat: number
    harshLong: number
    harshLat: number
  }
}
GET/v1/platform/mirage/gifs

Mirage's GIF settings: the provider (klipy, giphy or off) and content rating in force, the defaults, and which providers have their key (never the key). Platform staff (platform:admin).

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

Response 200

{
  settings: {
    provider: "off" | "klipy" | "giphy"
    rating: "r" | "g" | "pg" | "pg-13"
  }
  defaults: {
    provider: "off" | "klipy" | "giphy"
    rating: "r" | "g" | "pg" | "pg-13"
  }
  keys: {
    klipy: boolean
    giphy: boolean
  }
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/mirage/gifs

Changes the GIF provider or content rating (g, pg, pg-13, r). Applies within a minute. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key
curl -X PUT 'https://api.cactive.com.au/v1/platform/mirage/gifs' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  settings: {
    provider: "off" | "klipy" | "giphy"
    rating: "r" | "g" | "pg" | "pg-13"
  }
  defaults: {
    provider: "off" | "klipy" | "giphy"
    rating: "r" | "g" | "pg" | "pg-13"
  }
  keys: {
    klipy: boolean
    giphy: boolean
  }
  updatedAt: null | number
  updatedBy: null | string
}
GET/v1/platform/age/settings

The age gate's settings: mode (off, self_declared: the date of birth, estimation: a face check in ID) and the face check's rules (region, minConfidence, passLowAtLeast, underHighBelow, retries, attemptsPerDay): what's stored, what's in force, the defaults and who changed them last. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 403Age checks are changed by people.
curl 'https://api.cactive.com.au/v1/platform/age/settings' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  stored: {
    mode?: "off" | "self_declared" | "estimation"
    estimation?: {
      region?: string
      minConfidence?: number
      passLowAtLeast?: number
      underHighBelow?: number
      retries?: number
      attemptsPerDay?: number
    }
  }
  settings: {
    mode: "off" | "self_declared" | "estimation"
    estimation: {
      region: string
      minConfidence: number
      passLowAtLeast: number
      underHighBelow: number
      retries: number
      attemptsPerDay: number
    }
  }
  defaults: {
    mode: "off" | "self_declared" | "estimation"
    estimation: {
      region: string
      minConfidence: number
      passLowAtLeast: number
      underHighBelow: number
      retries: number
      attemptsPerDay: number
    }
  }
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/age/settings

Changes the age gate's mode or the face check's rules (estimation, any of them; null puts one back to its default). Takes effect within a minute. Audited with the mode. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 403Age checks are changed by people.
curl -X PUT 'https://api.cactive.com.au/v1/platform/age/settings' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  previousMode: "off" | "self_declared" | "estimation"
  stored: {
    mode?: "off" | "self_declared" | "estimation"
    estimation?: {
      region?: string
      minConfidence?: number
      passLowAtLeast?: number
      underHighBelow?: number
      retries?: number
      attemptsPerDay?: number
    }
  }
  settings: {
    mode: "off" | "self_declared" | "estimation"
    estimation: {
      region: string
      minConfidence: number
      passLowAtLeast: number
      underHighBelow: number
      retries: number
      attemptsPerDay: number
    }
  }
  defaults: {
    mode: "off" | "self_declared" | "estimation"
    estimation: {
      region: string
      minConfidence: number
      passLowAtLeast: number
      underHighBelow: number
      retries: number
      attemptsPerDay: number
    }
  }
  updatedAt: null | number
  updatedBy: null | string
}
GET/v1/platform/age/accounts

An account's age by email: its date of birth (and whether staff set it), the age it gives or its last check's, the gate and face checks left today. 404 when nobody has the address. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Query parameters

  • emailstring

    Default "".

Errors

  • 403Age checks are changed by people.
  • 404Nobody has that email address.
curl 'https://api.cactive.com.au/v1/platform/age/accounts' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  account: {
    userId: string
    email: string
    name: null | string
    createdAt?: number
  }
  age: {
    birthDate: null | string
    birthDateSource: null | "staff" | "self"
    age: null | {
      outcome: "16_plus" | "under_16"
      adult?: boolean
      method: "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
      provider: string
      reference?: string
      checkedAt: number
      recheckAfter?: number
    }
    gate: {
      open: true
      method: "none" | "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
      checkedAt: number
    } | {
      open: false
      reason: "under_16" | "unchecked"
      recheckAfter: null | number
      check?: "estimation" | "date_of_birth"
    }
    mode: "off" | "self_declared" | "estimation"
    estimation: {
      available: boolean
      standIn: boolean
      attemptsLeft: number
      inconclusive: number
      retries: number
    }
  }
}
PUT/v1/platform/age/accounts/:userId/date-of-birth

Corrects someone's date of birth (dateOfBirth, YYYY-MM-DD; an optional note), with their evidence. The correction becomes the account's age: earlier checks and face-check counts go. Audited with the note (what staff saw), never the date. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • userId

    A member's user id (usr_…).

Errors

  • 403Age checks are changed by people.
curl -X PUT 'https://api.cactive.com.au/v1/platform/age/accounts/{userId}/date-of-birth' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  age: {
    birthDate: null | string
    birthDateSource: null | "staff" | "self"
    age: null | {
      outcome: "16_plus" | "under_16"
      adult?: boolean
      method: "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
      provider: string
      reference?: string
      checkedAt: number
      recheckAfter?: number
    }
    gate: {
      open: true
      method: "none" | "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
      checkedAt: number
    } | {
      open: false
      reason: "under_16" | "unchecked"
      recheckAfter: null | number
      check?: "estimation" | "date_of_birth"
    }
    mode: "off" | "self_declared" | "estimation"
    estimation: {
      available: boolean
      standIn: boolean
      attemptsLeft: number
      inconclusive: number
      retries: number
    }
  }
}
DELETE/v1/platform/age/accounts/:userId

Clears someone's age (date of birth, checks and face-check counts), so they declare again. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • userId

    A member's user id (usr_…).

Errors

  • 403Age checks are changed by people.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/age/accounts/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  age: {
    birthDate: null | string
    birthDateSource: null | "staff" | "self"
    age: null | {
      outcome: "16_plus" | "under_16"
      adult?: boolean
      method: "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
      provider: string
      reference?: string
      checkedAt: number
      recheckAfter?: number
    }
    gate: {
      open: true
      method: "none" | "document" | "dev" | "self_declared" | "estimation" | "digital_id" | "bank" | "inference" | "staff"
      checkedAt: number
    } | {
      open: false
      reason: "under_16" | "unchecked"
      recheckAfter: null | number
      check?: "estimation" | "date_of_birth"
    }
    mode: "off" | "self_declared" | "estimation"
    estimation: {
      available: boolean
      standIn: boolean
      attemptsLeft: number
      inconclusive: number
      retries: number
    }
  }
}
GET/v1/platform/caity

The assistant's platform settings: search (the web search provider, exa, brave or mock, any prices per 1,000 queries, the defaultPrices, and which providers have their key on this stage, never the key) voice (whether speech to speech is on, sonic, and whether this stage runs the voice bridge) and images (whether pictures are on, and each image model with its name, where it runs, what it does, price per picture and whether it's enabled), each with when it changed. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 500There's no platform table on this stage.
curl 'https://api.cactive.com.au/v1/platform/caity' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  search: {
    settings: {
      provider: "exa" | "brave" | "mock"
      prices?: {
        exa?: {
          links: number
          text: number
        }
        brave?: {
          links: number
          text: number
        }
        mock?: {
          links: number
          text: number
        }
      }
    }
    defaultPrices: {
      exa: {
        links: number
        text: number
      }
      brave: {
        links: number
        text: number
      }
      mock: {
        links: number
        text: number
      }
    }
    keys: {
      exa: boolean
      brave: boolean
    }
    updatedAt: null | number
    updatedBy: null | string
  }
  voice: {
    bridge: boolean
    settings: {
      sonic: boolean
    }
    updatedAt: null | number
    updatedBy: null | string
  }
  images: {
    on: boolean
    models: {
      id: string
      name: string
      madeIn: string
      ops: ("generate" | "inpaint" | "outpaint" | "remove-background" | "restyle")[]
      pricePerImage: number
      enabled: boolean
    }[]
    updatedAt: null | number
  }
  codeCloud: {
    settings: {
      on: boolean
      registries: string[]
      agent: {
        "linux-arm64"?: {
          version: string
          sha256: string
        }
        "linux-x64"?: {
          version: string
          sha256: string
        }
      }
      minuteUsd: number
    }
    updatedAt: null | number
    updatedBy: null | string
  }
}
PUT/v1/platform/caity/voice

Turns the assistant's speech to speech on or off (sonic). It runs only where the stage runs the voice bridge. Applies within 30 seconds. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 400Say whether speech to speech is on (sonic: true or false).
  • 403Caity's settings are changed by people.
  • 500There's no platform table on this stage.
curl -X PUT 'https://api.cactive.com.au/v1/platform/caity/voice' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voice: {
    bridge: boolean
    settings: {
      sonic: boolean
    }
    updatedAt: null | number
    updatedBy: null | string
  }
}
PUT/v1/platform/caity/images

Turns the assistant's pictures on or off (on) and changes image models by id (models: { <id>: { enabled, pricePerImage } }, US$0 to US$10 a picture); what it leaves out keeps its value. Applies within 30 seconds. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 403Caity's settings are changed by people.
  • 500There's no platform table on this stage.
curl -X PUT 'https://api.cactive.com.au/v1/platform/caity/images' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  images: {
    on: boolean
    models: {
      id: string
      name: string
      madeIn: string
      ops: ("generate" | "inpaint" | "outpaint" | "remove-background" | "restyle")[]
      pricePerImage: number
      enabled: boolean
    }[]
    updatedAt: null | number
  }
}
PUT/v1/platform/caity/code-cloud

Changes Code mode in the cloud: on or off (on), the package registries its builds may reach (registries, host names or *. and a domain, at most 60), the agent release each platform runs (agent: { "linux-arm64": { version, sha256 } }, null removes one) and a build minute's price (minuteUsd). What it leaves out stays. Applies within 30 seconds. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 403Caity's settings are changed by people.
  • 500There's no platform table on this stage.
curl -X PUT 'https://api.cactive.com.au/v1/platform/caity/code-cloud' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  codeCloud: {
    settings: {
      on: boolean
      registries: string[]
      agent: {
        "linux-arm64"?: {
          version: string
          sha256: string
        }
        "linux-x64"?: {
          version: string
          sha256: string
        }
      }
      minuteUsd: number
    }
    updatedAt: null | number
    updatedBy: null | string
  }
}
GET/v1/platform/health/metrics

Every Health metric definition (enabled or not): category, kind, units, aggregation, sensitivity, HealthKit mapping and leaderboard mode.

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

Response 200

{
  metrics: {
    metricId: string
    label: string
    category: "other" | "body" | "heart" | "cycle" | "activity" | "hearing" | "medications" | "mental" | "mindfulness" | "mobility" | "nutrition" | "respiratory" | "sleep" | "symptoms" | "vitals" | "sexual"
    kind: "duration" | "event" | "category" | "quantity"
    unit: string
    units: {
      id: string
      label: string
      factor: number
      offset?: number
    }[]
    aggregation: "duration" | "count" | "latest" | "sum" | "average"
    decimals: number
    sensitivity: "standard" | "sensitive" | "sexual"
    values?: {
      value: number
      label: string
    }[]
    healthKit?: {
      identifier: string
      kind: "category" | "quantity" | "workout"
      unit?: string
      readOnly?: boolean
      factor?: number
      categoryValues?: number[]
    }
    healthConnect?: string
    leaderboard?: "count" | "sum" | "average"
    min?: number
    max?: number
    pinned?: boolean
    description?: string
    enabled: boolean
    sortOrder: number
  }[]
}
PUT/v1/platform/health/metrics/:metricId

Adds or changes a metric definition. In the platform's audit log.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • metricId

    A Health metric's id from the registry (steps, heart_rate, sleep, sexual_activity, …), as GET /v1/me/health/metrics lists them.

curl -X PUT 'https://api.cactive.com.au/v1/platform/health/metrics/{metricId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  metric: {
    metricId: string
    label: string
    category: "other" | "body" | "heart" | "cycle" | "activity" | "hearing" | "medications" | "mental" | "mindfulness" | "mobility" | "nutrition" | "respiratory" | "sleep" | "symptoms" | "vitals" | "sexual"
    kind: "duration" | "event" | "category" | "quantity"
    unit: string
    units: {
      id: string
      label: string
      factor: number
      offset?: number
    }[]
    aggregation: "duration" | "count" | "latest" | "sum" | "average"
    decimals: number
    sensitivity: "standard" | "sensitive" | "sexual"
    values?: {
      value: number
      label: string
    }[]
    healthKit?: {
      identifier: string
      kind: "category" | "quantity" | "workout"
      unit?: string
      readOnly?: boolean
      factor?: number
      categoryValues?: number[]
    }
    healthConnect?: string
    leaderboard?: "count" | "sum" | "average"
    min?: number
    max?: number
    pinned?: boolean
    description?: string
    enabled: boolean
    sortOrder: number
  }
}
PUT/v1/platform/health/metrics/:metricId/enabled

Turns a metric on or off (enabled); definitions are never deleted. In the platform's audit log.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • metricId

    A Health metric's id from the registry (steps, heart_rate, sleep, sexual_activity, …), as GET /v1/me/health/metrics lists them.

Request body

  • enabledbooleanrequired

Also checked: Unknown fields are rejected.

curl -X PUT 'https://api.cactive.com.au/v1/platform/health/metrics/{metricId}/enabled' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "enabled": true
  }'
Send it from this page with your session or a key.

Response 200

{
  metric: {
    enabled: boolean
    metricId: string
    label: string
    category: "other" | "body" | "heart" | "cycle" | "activity" | "hearing" | "medications" | "mental" | "mindfulness" | "mobility" | "nutrition" | "respiratory" | "sleep" | "symptoms" | "vitals" | "sexual"
    kind: "duration" | "event" | "category" | "quantity"
    unit: string
    units: {
      id: string
      label: string
      factor: number
      offset?: number
    }[]
    aggregation: "duration" | "count" | "latest" | "sum" | "average"
    decimals: number
    sensitivity: "standard" | "sensitive" | "sexual"
    values?: {
      value: number
      label: string
    }[]
    healthKit?: {
      identifier: string
      kind: "category" | "quantity" | "workout"
      unit?: string
      readOnly?: boolean
      factor?: number
      categoryValues?: number[]
    }
    healthConnect?: string
    leaderboard?: "count" | "sum" | "average"
    min?: number
    max?: number
    pinned?: boolean
    description?: string
    sortOrder: number
  }
}
POST/v1/platform/health/metrics/seed

Adds seed definitions the registry is missing (never changes existing ones).

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key
curl -X POST 'https://api.cactive.com.au/v1/platform/health/metrics/seed' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  added: string[]
}
GET/v1/platform/health/settings

Health's platform settings (samples per request, how long the audit keeps entries) and their defaults.

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

Response 200

{
  settings: {
    samplesPerRequest: number
    auditDays: number
    sexualLeaderboardServers: string[]
  }
  defaults: {
    samplesPerRequest: number
    auditDays: number
    sexualLeaderboardServers: string[]
  }
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/health/settings

Changes Health's platform settings. In the platform's audit log.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key
curl -X PUT 'https://api.cactive.com.au/v1/platform/health/settings' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  settings: {
    samplesPerRequest: number
    auditDays: number
    sexualLeaderboardServers: string[]
  }
  defaults: {
    samplesPerRequest: number
    auditDays: number
    sexualLeaderboardServers: string[]
  }
  updatedAt: null | number
  updatedBy: null | string
}
GET/v1/platform/health/restricted-leaderboards

The Mirage servers allowed leaderboards for restricted metrics, with their names. Platform staff.

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

Response 200

{
  servers: {
    serverId: string
    name: null | string
  }[]
}
PUT/v1/platform/health/restricted-leaderboards/:serverId

Allows a Mirage server leaderboards for restricted metrics: its managers then see the option. In the platform's audit log.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • serverId

    Mirage server id (gld_…).

curl -X PUT 'https://api.cactive.com.au/v1/platform/health/restricted-leaderboards/{serverId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.
DELETE/v1/platform/health/restricted-leaderboards/:serverId

Takes the allowance away: the option goes off and everyone ranked on those boards there is taken off at once (removed: opt-ins and scores). In the platform's audit log.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • serverId

    Mirage server id (gld_…).

curl -X DELETE 'https://api.cactive.com.au/v1/platform/health/restricted-leaderboards/{serverId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.
GET/v1/platform/food/receipt-rules

The supermarkets whose e-receipts Food reads (stores, enabled or not, in order: sender domains, receipt words, end-of-items and not-item lines, house brands, how their PDFs are read (pdf: rules, model or off)), the words that mark a receipt line as not food (nonFoodWords), and which kinds are still the seed (seed). Platform staff only.

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

Response 200

{
  stores: {
    name: string
    pdf: "off" | "model" | "rules"
    enabled: boolean
    sortOrder: number
    senderDomains: string[]
    receiptMarks: string[]
    endMarks: string[]
    skipMarks: string[]
    brandPrefixes: string[]
    storeId: string
    updatedAt?: number
  }[]
  nonFoodWords: string[]
  seed: {
    stores: boolean
    nonFoodWords: boolean
  }
}
PUT/v1/platform/food/receipt-stores/:storeId

Creates or replaces a receipt store. Sender domains must be the store's own (public suffixes and free mail are refused). Mail and Food use it within a minute. Audited.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • storeId

    A Food receipt store's id (lower-case letters, digits and hyphens, e.g. woolworths).

Request body

  • namestringrequired

    1–60 characters. Trimmed.

  • senderDomainsstring[]required

    1–20 items. Each up to 253 characters, trimmed, lowercased.

  • receiptMarksany JSONrequired
  • endMarksany JSONrequired
  • skipMarksany JSONrequired
  • brandPrefixesany JSONrequired
  • pdf"rules" | "model" | "off"

    Default "rules".

  • enabledboolean

    Default true.

  • sortOrderinteger

    Default 0. 0–100000.

Also checked: Unknown fields are rejected.

curl -X PUT 'https://api.cactive.com.au/v1/platform/food/receipt-stores/{storeId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Example",
    "senderDomains": [
      "example"
    ],
    "receiptMarks": {},
    "endMarks": {},
    "skipMarks": {},
    "brandPrefixes": {}
  }'
Send it from this page with your session or a key.

Response 200

{
  store: {
    name: string
    createdAt?: number
    updatedAt?: number
    pdf?: "off" | "model" | "rules"
    enabled?: boolean
    sortOrder?: number
    storeId: string
    senderDomains: string[]
    receiptMarks: string[]
    endMarks: string[]
    skipMarks: string[]
    brandPrefixes: string[]
  }
}
DELETE/v1/platform/food/receipt-stores/:storeId

Removes a receipt store. With none left, the seed's stores are read again; turn a store off to read none. Audited.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • storeId

    A Food receipt store's id (lower-case letters, digits and hyphens, e.g. woolworths).

Errors

  • 404Store not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/food/receipt-stores/{storeId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
POST/v1/platform/food/non-food-words

Adds a non-food word (word, stored lower case). Audited.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • wordstringrequired

    Up to 60 characters.

Also checked: Unknown fields are rejected.

Errors

  • 400A word to match is 2 to 40 letters, digits, spaces or hyphens.
curl -X POST 'https://api.cactive.com.au/v1/platform/food/non-food-words' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "word": "example"
  }'
Send it from this page with your session or a key.

Response 201

{
  word: string
}
DELETE/v1/platform/food/non-food-words/:word

Removes a non-food word. Audited.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • word

    A Food non-food word, URL-encoded (e.g. gift%20card).

Errors

  • 404Word not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/food/non-food-words/{word}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
POST/v1/platform/food/receipt-rules/test

Reads a pasted e-receipt (from, subject, body as HTML or text), a PDF receipt (pdf, base64, up to 110 KB) or both with the saved rules, as Food does without the model: the store, whether it's a receipt, where the lines came from, what became of the PDF (its text, or why it wasn't read), the date, the total and each line, food or not. Nothing is kept.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • fromstringrequired

    3–320 characters. Trimmed.

  • subjectstring

    Default "". Up to 300 characters.

  • bodystring

    Default "". Up to 200,000 characters.

  • pdfstring

Also checked: Unknown fields are rejected. Paste a receipt or choose a PDF.

curl -X POST 'https://api.cactive.com.au/v1/platform/food/receipt-rules/test' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "from": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  result: {
    lines: {
      ingredientId?: string
      food: boolean
      unit?: "slice" | "head" | "g" | "kg" | "mg" | "oz" | "lb" | "ml" | "l" | "tsp" | "tbsp" | "cup" | "floz" | "pint" | "quart" | "pinch" | "dash" | "piece" | "clove" | "can" | "jar" | "bunch" | "handful" | "sprig" | "sheet" | "packet" | "stick" | "fillet" | "rasher" | "leaf" | "stalk"
      quantity?: number
      text: string
      name: string
      price?: number
    }[]
    total?: number
    purchasedOn?: string
    model: "text" | "pdf"
    pdf?: {
      read: true
      pages: number
      text: string
      truncated: boolean
    } | {
      read: false
      problem: "not-pdf" | "too-large" | "encrypted" | "too-complex" | "unreadable" | "no-text"
      message: string
    } | {
      read: false
      skipped: "off" | "model"
    }
    marked: boolean
    isReceipt: boolean
    source: "message" | "pdf"
    store?: {
      id: string
      name: string
    }
  }
}
GET/v1/platform/profile-effects

Every profile effect in the catalogue (enabled or not): id, name, renderer (sparkles, snow, hearts, glow, aurora or confetti), colors and order.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key
curl 'https://api.cactive.com.au/v1/platform/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[]
    enabled: boolean
    sortOrder: number
  }[]
}
PUT/v1/platform/profile-effects/:effectId

Adds or changes a profile effect (name, renderer, one to four colors, enabled, sortOrder). People wearing it keep the look they chose until they choose again. In the platform's audit log.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • effectId

    A profile effect's id from the catalogue (starlight, northern-lights): 2–40 lowercase letters, digits or hyphens.

curl -X PUT 'https://api.cactive.com.au/v1/platform/profile-effects/{effectId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  effect: {
    effectId: string
    name: string
    renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
    colors: string[]
    enabled: boolean
    sortOrder: number
  }
}
PUT/v1/platform/profile-effects/:effectId/enabled

Turns a profile effect on or off (enabled): off, nobody can choose it. In the platform's audit log.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • effectId

    A profile effect's id from the catalogue (starlight, northern-lights): 2–40 lowercase letters, digits or hyphens.

Request body

  • enabledbooleanrequired

Also checked: Unknown fields are rejected.

curl -X PUT 'https://api.cactive.com.au/v1/platform/profile-effects/{effectId}/enabled' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "enabled": true
  }'
Send it from this page with your session or a key.

Response 200

{
  effect: {
    effectId: string
    name: string
    renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
    colors: string[]
    enabled: boolean
    sortOrder: number
  }
}
POST/v1/platform/profile-effects/seed

Adds the built-in profile effects the catalogue is missing (never changes existing ones).

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key
curl -X POST 'https://api.cactive.com.au/v1/platform/profile-effects/seed' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  added: string[]
}
GET/v1/platform/locales

The languages people can choose, as data (locales: locale, label, spelling (au or us), weekStart (0 Sunday … 6 Saturday), enabled, sortOrder), whether a list is stored or the built-in one applies, the built-in one, and who changed it last. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key
curl 'https://api.cactive.com.au/v1/platform/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
    enabled: boolean
    sortOrder: number
  }[]
  stored: boolean
  defaults: {
    locale: string
    label: string
    spelling: "au" | "us"
    weekStart: number
    enabled: boolean
    sortOrder: number
  }[]
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/locales

Replaces the list of languages (locales: the whole list; null goes back to the built-in English (Australia) and English (US)). en-AU stays enabled; each language once. People's apps see the change within a minute. In the platform's audit log.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 400Send locales: the list, or null for the built-in one.
curl -X PUT 'https://api.cactive.com.au/v1/platform/locales' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  locales: {
    locale: string
    label: string
    spelling: "au" | "us"
    weekStart: number
    enabled: boolean
    sortOrder: number
  }[]
  stored: boolean
  defaults: {
    locale: string
    label: string
    spelling: "au" | "us"
    weekStart: number
    enabled: boolean
    sortOrder: number
  }[]
  updatedAt: null | number
  updatedBy: null | string
}
GET/v1/platform/badges

The settings, the seed (to reset to) and who saved them last.

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

Response 200

{
  settings: {
    tiers: {
      tierId: string
      name: string
      months: number
      art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
      form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
    }[]
    earlySupporterCutoff: string
    gapDays: number
  }
  defaults: {
    tiers: {
      tierId: string
      name: string
      months: number
      art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
      form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
    }[]
    earlySupporterCutoff: string
    gapDays: number
  }
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/badges

Saves the tiers, the cutoff (YYYY-MM-DD) and the lapse allowed in days.

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

Response 200

{
  settings: {
    tiers: {
      tierId: string
      name: string
      months: number
      art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
      form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
    }[]
    earlySupporterCutoff: string
    gapDays: number
  }
  defaults: {
    tiers: {
      tierId: string
      name: string
      months: number
      art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
      form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
    }[]
    earlySupporterCutoff: string
    gapDays: number
  }
  updatedAt: null | number
  updatedBy: null | string
}
GET/v1/platform/badges/people/:who

One person (usr_… or their email): their badges, whether they show them, staff's grant and the accounts that count.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • who

    A person's user id (usr_…) or an email address, as listed in the request's participants.

curl 'https://api.cactive.com.au/v1/platform/badges/people/{who}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  person: {
    userId: string
    name: null | string
    email: string
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    hidden: boolean
    grant: null | {
      state: "revoked" | "granted"
      by: string
      at: number
    }
    accounts: {
      ownerId: string
      ownerType: "user" | "org"
      status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
      subscribedAt?: number
      firstPaidAt?: number
      paidSince?: number
      lapsedAt?: number
    }[]
  }
}
PUT/v1/platform/badges/people/:who/early-supporter

Early Supporter by hand: granted, revoked, or auto (billing decides again).

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • who

    A person's user id (usr_…) or an email address, as listed in the request's participants.

Request body

  • state"granted" | "revoked" | "auto"required

Also checked: Unknown fields are rejected.

curl -X PUT 'https://api.cactive.com.au/v1/platform/badges/people/{who}/early-supporter' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "state": "granted"
  }'
Send it from this page with your session or a key.

Response 200

{
  person: {
    userId: string
    name: null | string
    email: string
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    hidden: boolean
    grant: null | {
      state: "revoked" | "granted"
      by: string
      at: number
    }
    accounts: {
      ownerId: string
      ownerType: "user" | "org"
      status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
      subscribedAt?: number
      firstPaidAt?: number
      paidSince?: number
      lapsedAt?: number
    }[]
  }
}
GET/v1/platform/people/subsidised

Everyone the platform pays a personal plan for, newest first (an ended one until the reconcile removes it).

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

Response 200

{
  people: {
    userId: string
    name: null | string
    email: string
    plan: {
      planId?: string
      via: "subsidised" | "subscription" | "free"
      planName?: string
    }
    subsidy: null | {
      planId: string
      planName?: string
      by: string
      byLabel?: string
      at: number
      until?: number
      note?: string
      active: boolean
    }
    subscription: null | {
      planId?: string
      planName?: string
      status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
      interval?: "month" | "two-year" | "year"
    }
  }[]
}
GET/v1/platform/people/:who

One person (usr_… or their email): the plan they have, a subsidy and their own subscription.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • who

    A person's user id (usr_…) or an email address, as listed in the request's participants.

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

Response 200

{
  person: {
    userId: string
    name: null | string
    email: string
    plan: {
      planId?: string
      via: "subsidised" | "subscription" | "free"
      planName?: string
    }
    subsidy: null | {
      planId: string
      planName?: string
      by: string
      byLabel?: string
      at: number
      until?: number
      note?: string
      active: boolean
    }
    subscription: null | {
      planId?: string
      planName?: string
      status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
      interval?: "month" | "two-year" | "year"
    }
  }
}
PUT/v1/platform/people/:who/subsidy

Gives the person a personal plan the platform pays for, or changes its plan, end (until, ms; null: no end) or note (null clears it). No card and no subscription; one they pay for keeps running and they get the higher of the two.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • who

    A person's user id (usr_…) or an email address, as listed in the request's participants.

Request body

  • planIdstringrequired

    Matches ^[a-z0-9][a-z0-9-]{1,62}$.

  • untilintegeror null

    > 0.

  • notestringor null

    Up to 500 characters.

Also checked: Unknown fields are rejected.

curl -X PUT 'https://api.cactive.com.au/v1/platform/people/{who}/subsidy' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "planId": "<planId>"
  }'
Send it from this page with your session or a key.

Response 200

{
  person: {
    userId: string
    name: null | string
    email: string
    plan: {
      planId?: string
      via: "subsidised" | "subscription" | "free"
      planName?: string
    }
    subsidy: null | {
      planId: string
      planName?: string
      by: string
      byLabel?: string
      at: number
      until?: number
      note?: string
      active: boolean
    }
    subscription: null | {
      planId?: string
      planName?: string
      status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
      interval?: "month" | "two-year" | "year"
    }
  }
}
DELETE/v1/platform/people/:who/subsidy

Takes the subsidy away: back to their paid plan, else Free (files kept; the retention period starts).

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • who

    A person's user id (usr_…) or an email address, as listed in the request's participants.

curl -X DELETE 'https://api.cactive.com.au/v1/platform/people/{who}/subsidy' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  person: {
    userId: string
    name: null | string
    email: string
    plan: {
      planId?: string
      via: "subsidised" | "subscription" | "free"
      planName?: string
    }
    subsidy: null | {
      planId: string
      planName?: string
      by: string
      byLabel?: string
      at: number
      until?: number
      note?: string
      active: boolean
    }
    subscription: null | {
      planId?: string
      planName?: string
      status: "active" | "none" | "canceled" | "incomplete" | "trialing" | "past_due" | "unpaid"
      interval?: "month" | "two-year" | "year"
    }
  }
}
GET/v1/platform/mirage/reports

Every Mirage report (open ones, or status=all), newest first, with the reporter and server: the platform's review queue. before pages. platform:admin.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Query parameters

  • statusstring
  • beforestring
curl 'https://api.cactive.com.au/v1/platform/mirage/reports' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  reports: {
    reporter?: {
      userId: string
      name: string
    }
    serverName?: null | string
    reportId: string
    kind: "post" | "message" | "user" | "server" | "dm_message" | "story"
    status: "open" | "dismissed" | "actioned"
    reason: string
    reasonLabel: string
    details: null | string
    target: {
      userId: string
      name: string
    }
    serverId: null | string
    channelId: null | string
    messageId: null | string
    dmId: null | string
    snapshot: unknown
    resolvedBy: null | {
      userId: string
      name: string
    }
    resolvedAt: null | number
    note: null | string
    createdAt: number
  }[]
  next: null | string
}
PATCH/v1/platform/mirage/reports/:reportId

Marks any report actioned, dismissed or open, with an optional note. platform:admin.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • reportId

    A report's id: a Mirage report's (mrp_…) or a feedback report's (fbk_…).

Errors

  • 403Reports are reviewed by people.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/mirage/reports/{reportId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  report: {
    reporter?: {
      userId: string
      name: string
    }
    serverName?: null | string
    reportId: string
    kind: "post" | "message" | "user" | "server" | "dm_message" | "story"
    status: "open" | "dismissed" | "actioned"
    reason: string
    reasonLabel: string
    details: null | string
    target: {
      userId: string
      name: string
    }
    serverId: null | string
    channelId: null | string
    messageId: null | string
    dmId: null | string
    snapshot: unknown
    resolvedBy: null | {
      userId: string
      name: string
    }
    resolvedAt: null | number
    note: null | string
    createdAt: number
  }
}
GET/v1/platform/pipelines/runners

Every hosted runner type (enabled or not): label, CodeBuild project, environment and compute type, image, minute multiplier, longest timeout, Docker, orgs it's limited to. Needs platform:admin.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 503No platform table
curl 'https://api.cactive.com.au/v1/platform/pipelines/runners' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  runners: {
    label: string
    description: string
    project: "lambda" | "container"
    environmentType: string
    computeType: string
    image: string
    multiplier: number
    maxMinutes: number
    docker: boolean
    orgs: string[]
    isDefault: boolean
    enabled: boolean
    sortOrder: number
  }[]
}
PUT/v1/platform/pipelines/runners/:label

Creates or changes a hosted runner type (Lambda compute: at most 15 minutes, no Docker). Needs platform:infra.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:infra in the platform organisation
Get an API key

Path parameters

  • label

    Hosted runner type label, e.g. linux-arm64.

Request body

  • descriptionstring

    Default "". Up to 200 characters. Trimmed.

  • project"lambda" | "container"required
  • environmentType"ARM_LAMBDA_CONTAINER" | "LINUX_LAMBDA_CONTAINER" | "ARM_CONTAINER" | "LINUX_CONTAINER"required
  • computeTypestringrequired

    Matches ^BUILD_(LAMBDA_\d+GB|GENERAL1_[A-Z0-9]+)$.

  • imagestringrequired

    3–300 characters. Trimmed.

  • multipliernumber

    Default 1. 0–100.

  • maxMinutesintegerrequired

    1–2160.

  • dockerboolean

    Default false.

  • orgsstring[]

    Default []. Up to 100 items. Each matches ^org_[0-9a-z]+$.

  • isDefaultboolean

    Default false.

  • enabledboolean

    Default true.

  • sortOrderinteger

    Default 0.

Errors

  • 400Labels are lower case letters, numbers, '.' and '-' (not hosted, self-hosted or platform-deploy)
  • 400Lambda compute: a Lambda environment type, at most 15 minutes, no Docker
  • 400Container runners use ARM_CONTAINER or LINUX_CONTAINER
  • 503No platform table
curl -X PUT 'https://api.cactive.com.au/v1/platform/pipelines/runners/{label}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "project": "lambda",
    "environmentType": "ARM_LAMBDA_CONTAINER",
    "computeType": "example",
    "image": "example",
    "maxMinutes": 1
  }'
Send it from this page with your session or a key.

Response 200

{
  runner: {
    label: string
    createdAt?: number
    updatedAt?: number
    project: "lambda" | "container"
    description?: string
    image: string
    enabled?: boolean
    orgs?: string[]
    isDefault?: boolean
    sortOrder?: number
    environmentType: string
    computeType: string
    multiplier?: number
    maxMinutes: number
    docker?: boolean
  }
}
DELETE/v1/platform/pipelines/runners/:label

Removes a hosted runner type; jobs naming it fail with the list of others. Needs platform:infra.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:infra in the platform organisation
Get an API key

Path parameters

  • label

    Hosted runner type label, e.g. linux-arm64.

Errors

  • 503No platform table
curl -X DELETE 'https://api.cactive.com.au/v1/platform/pipelines/runners/{label}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/platform/pipelines/settings

The platform's pipeline settings (matrix and run size, log, artifact and cache sizes, workflow file size, schedule interval, approval expiry, queue timeout, secret size and count) and their defaults. Needs platform:admin.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 503No platform table
curl 'https://api.cactive.com.au/v1/platform/pipelines/settings' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  settings: {
    maxMatrixJobs: number
    maxJobs: number
    maxLogMb: number
    maxArtifactMb: number
    maxCacheMb: number
    maxWorkflowKb: number
    scheduleMinMinutes: number
    approvalDays: number
    queueHours: number
    heartbeatMinutes: number
    defaultArtifactDays: number
    cacheUnusedDays: number
    secretKb: number
    maxSecrets: number
  }
  defaults: {
    maxMatrixJobs: number
    maxJobs: number
    maxLogMb: number
    maxArtifactMb: number
    maxCacheMb: number
    maxWorkflowKb: number
    scheduleMinMinutes: number
    approvalDays: number
    queueHours: number
    heartbeatMinutes: number
    defaultArtifactDays: number
    cacheUnusedDays: number
    secretKb: number
    maxSecrets: number
  }
}
PUT/v1/platform/pipelines/settings

Changes the pipeline settings; they apply within a minute. Needs platform:infra.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:infra in the platform organisation
Get an API key

Request body

  • maxMatrixJobsintegerrequired

    1–1000.

  • maxJobsintegerrequired

    1–1000.

  • maxLogMbintegerrequired

    1–1024.

  • maxArtifactMbintegerrequired

    1–5120.

  • maxCacheMbintegerrequired

    1–5120.

  • maxWorkflowKbintegerrequired

    16–4096.

  • scheduleMinMinutesintegerrequired

    1–1440.

  • approvalDaysintegerrequired

    1–90.

  • queueHoursintegerrequired

    1–168.

  • heartbeatMinutesintegerrequired

    1–60.

  • defaultArtifactDaysintegerrequired

    1–400.

  • cacheUnusedDaysintegerrequired

    1–90.

  • secretKbintegerrequired

    1–64.

  • maxSecretsintegerrequired

    1–1000.

Errors

  • 503No platform table
curl -X PUT 'https://api.cactive.com.au/v1/platform/pipelines/settings' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "maxMatrixJobs": 1,
    "maxJobs": 1,
    "maxLogMb": 1,
    "maxArtifactMb": 1,
    "maxCacheMb": 1,
    "maxWorkflowKb": 1,
    "scheduleMinMinutes": 1,
    "approvalDays": 1,
    "queueHours": 1,
    "heartbeatMinutes": 1,
    "defaultArtifactDays": 1,
    "cacheUnusedDays": 1,
    "secretKb": 1,
    "maxSecrets": 1
  }'
Send it from this page with your session or a key.

Response 200

{
  settings: {
    maxMatrixJobs: number
    maxJobs: number
    maxLogMb: number
    maxArtifactMb: number
    maxCacheMb: number
    maxWorkflowKb: number
    scheduleMinMinutes: number
    approvalDays: number
    queueHours: number
    heartbeatMinutes: number
    defaultArtifactDays: number
    cacheUnusedDays: number
    secretKb: number
    maxSecrets: number
  }
}
GET/v1/platform/feedback

The inbox: reports newest first (open ones unless status says otherwise), filtered, with possible duplicates.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Errors

  • 400Unknown filter.
  • 403Feedback is reviewed by people.
curl 'https://api.cactive.com.au/v1/platform/feedback' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  reports: {
    reportId: string
    type: "suggestion" | "bug" | "feedback"
    typeLabel: string
    status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
    severity: null | "low" | "medium" | "high" | "critical"
    title: string
    description: string
    app: string
    appLabel: string
    reporter: {
      userId: string
      name: null | string
      email: null | string
    }
    contactOk: boolean
    orgId: null | string
    context: {
      app?: string
      appName?: string
      version?: string
      build?: string
      path?: string
      orgId?: string
      browser?: string
      os?: string
      device?: string
      viewport?: {
        width: number
        height: number
        scale?: number
      }
      locale?: string
      timeZone?: string
      shell?: string
      errors?: {
        message: string
        at: number
        source?: string
      }[]
      requests?: {
        method: string
        url: string
        status: number
        at: number
      }[]
      routes?: {
        path: string
        at: number
      }[]
    }
    images: {
      imageId: string
      type: "image/png" | "image/jpeg" | "image/webp"
      size: number
    }[]
    fingerprint: string
    similar: {
      count: number
      reportIds: string[]
    }
    spamReason: null | string
    commentCount: number
    issue: null | {
      orgId: string
      issueId: string
      key: string
      spaceKey: string
    }
    updatedBy: null | string
    createdAt: number
    submittedAt: number
    updatedAt?: number
  }[]
  next: null | string
  counts: {
    resolved: number
    dismissed: number
    spam: number
    new: number
    triaged: number
  }
  apps: {
    app: string
    label: string
  }[]
}
GET/v1/platform/feedback/:reportId

One report: images (signed links), comments and possible duplicates.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • reportId

    A report's id: a Mirage report's (mrp_…) or a feedback report's (fbk_…).

Errors

  • 403Feedback is reviewed by people.
curl 'https://api.cactive.com.au/v1/platform/feedback/{reportId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  report: {
    images: {
      url: null | string
      imageId: string
      type: "image/png" | "image/jpeg" | "image/webp"
      size: number
    }[]
    reportId: string
    type: "suggestion" | "bug" | "feedback"
    typeLabel: string
    status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
    severity: null | "low" | "medium" | "high" | "critical"
    title: string
    description: string
    app: string
    appLabel: string
    reporter: {
      userId: string
      name: null | string
      email: null | string
    }
    contactOk: boolean
    orgId: null | string
    context: {
      app?: string
      appName?: string
      version?: string
      build?: string
      path?: string
      orgId?: string
      browser?: string
      os?: string
      device?: string
      viewport?: {
        width: number
        height: number
        scale?: number
      }
      locale?: string
      timeZone?: string
      shell?: string
      errors?: {
        message: string
        at: number
        source?: string
      }[]
      requests?: {
        method: string
        url: string
        status: number
        at: number
      }[]
      routes?: {
        path: string
        at: number
      }[]
    }
    fingerprint: string
    similar: {
      count: number
      reportIds: string[]
    }
    spamReason: null | string
    commentCount: number
    issue: null | {
      orgId: string
      issueId: string
      key: string
      spaceKey: string
    }
    updatedBy: null | string
    createdAt: number
    submittedAt: number
    updatedAt?: number
  }
  comments: {
    commentId: string
    author: {
      userId: string
      name: null | string
    }
    body: string
    createdAt?: number
  }[]
  similar: {
    reportId: string
    title: string
    type: "suggestion" | "bug" | "feedback"
    status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
    appLabel: string
    createdAt?: number
  }[]
}
PATCH/v1/platform/feedback/:reportId

Triage: status, severity (bugs) or type.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • reportId

    A report's id: a Mirage report's (mrp_…) or a feedback report's (fbk_…).

Errors

  • 403Feedback is reviewed by people.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/feedback/{reportId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  report: {
    reportId: string
    type: "suggestion" | "bug" | "feedback"
    typeLabel: string
    status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
    severity: null | "low" | "medium" | "high" | "critical"
    title: string
    description: string
    app: string
    appLabel: string
    reporter: {
      userId: string
      name: null | string
      email: null | string
    }
    contactOk: boolean
    orgId: null | string
    context: {
      app?: string
      appName?: string
      version?: string
      build?: string
      path?: string
      orgId?: string
      browser?: string
      os?: string
      device?: string
      viewport?: {
        width: number
        height: number
        scale?: number
      }
      locale?: string
      timeZone?: string
      shell?: string
      errors?: {
        message: string
        at: number
        source?: string
      }[]
      requests?: {
        method: string
        url: string
        status: number
        at: number
      }[]
      routes?: {
        path: string
        at: number
      }[]
    }
    images: {
      imageId: string
      type: "image/png" | "image/jpeg" | "image/webp"
      size: number
    }[]
    fingerprint: string
    similar: {
      count: number
      reportIds: string[]
    }
    spamReason: null | string
    commentCount: number
    issue: null | {
      orgId: string
      issueId: string
      key: string
      spaceKey: string
    }
    updatedBy: null | string
    createdAt: number
    submittedAt: number
    updatedAt?: number
  }
}
POST/v1/platform/feedback/:reportId/comments

An admin's comment (only admins see them).

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • reportId

    A report's id: a Mirage report's (mrp_…) or a feedback report's (fbk_…).

Errors

  • 403Feedback is reviewed by people.
curl -X POST 'https://api.cactive.com.au/v1/platform/feedback/{reportId}/comments' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  comment: {
    commentId: string
    author: {
      userId: string
      name: null | string
    }
    body: string
    createdAt: number
  }
}
POST/v1/platform/feedback/:reportId/convert

Turns a report into an issue in one of the platform org's Tasks spaces (space: its key or id), with its text, context and images; the report links to the issue and is triaged.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • reportId

    A report's id: a Mirage report's (mrp_…) or a feedback report's (fbk_…).

Errors

  • 400Choose a space.
  • 403Feedback is reviewed by people.
  • 403Missing scope platform:admin
curl -X POST 'https://api.cactive.com.au/v1/platform/feedback/{reportId}/convert' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  issue: {
    orgId: string
    issueId: string
    key: string
    spaceKey: string
  }
  report: {
    reportId: string
    type: "suggestion" | "bug" | "feedback"
    typeLabel: string
    status: "pending" | "resolved" | "dismissed" | "spam" | "new" | "triaged"
    severity: null | "low" | "medium" | "high" | "critical"
    title: string
    description: string
    app: string
    appLabel: string
    reporter: {
      userId: string
      name: null | string
      email: null | string
    }
    contactOk: boolean
    orgId: null | string
    context: {
      app?: string
      appName?: string
      version?: string
      build?: string
      path?: string
      orgId?: string
      browser?: string
      os?: string
      device?: string
      viewport?: {
        width: number
        height: number
        scale?: number
      }
      locale?: string
      timeZone?: string
      shell?: string
      errors?: {
        message: string
        at: number
        source?: string
      }[]
      requests?: {
        method: string
        url: string
        status: number
        at: number
      }[]
      routes?: {
        path: string
        at: number
      }[]
    }
    images: {
      imageId: string
      type: "image/png" | "image/jpeg" | "image/webp"
      size: number
    }[]
    fingerprint: string
    similar: {
      count: number
      reportIds: string[]
    }
    spamReason: null | string
    commentCount: number
    issue: null | {
      orgId: string
      issueId: string
      key: string
      spaceKey: string
    }
    updatedBy: null | string
    createdAt: number
    submittedAt: number
    updatedAt?: number
  }
}
DELETE/v1/platform/feedback/:reportId

Deletes a report, its comments and its images.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • reportId

    A report's id: a Mirage report's (mrp_…) or a feedback report's (fbk_…).

Errors

  • 403Feedback is reviewed by people.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/feedback/{reportId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  reportId: string
}
GET/v1/platform/deletions

Admin → Deletions: open account deletion requests by when they're due, then recent closed ones (or those with status), with the person's address until erased, the grace, where it was asked from, and in shadow mode the plan its erasure would run. platform:admin.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Query parameters

  • status"scheduled" | "cancelled" | "blocked" | "erasing" | "finalising" | "erased"
curl 'https://api.cactive.com.au/v1/platform/deletions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  deletions: {
    delId: string
    status: "blocked" | "cancelled" | "scheduled" | "erasing" | "finalising" | "erased"
    email?: string
    requestedAt: number
    eraseAt: number
    graceDays: number
    graceReason?: string
    client: string
    app?: string
    reason?: string
    cancelledAt?: number
    cancelledBy?: string
    plannedAt?: number
    planCounts?: {
      [key: string]: {
        [key: string]: number
      }
    }
    tasks: {
      total: number
      done: number
      failed: string[]
    }
    held?: boolean
  }[]
  launched: true
}
GET/v1/platform/deletions/:delId

One account deletion request and each handler's task (phase, status, attempts, counts, last error code). platform:admin.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • delId

    An account deletion request's id (del_…).

Errors

  • 400Not a deletion id.
curl 'https://api.cactive.com.au/v1/platform/deletions/{delId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  taskList: {
    updatedAt: number
    error?: string
    phase: "plan" | "erase" | "finalise"
    service: string
    status: "pending" | "done" | "failed" | "running"
    attempts: number
    counts: unknown
  }[]
  delId: string
  status: "blocked" | "cancelled" | "scheduled" | "erasing" | "finalising" | "erased"
  email?: string
  requestedAt: number
  eraseAt: number
  graceDays: number
  graceReason?: string
  client: string
  app?: string
  reason?: string
  cancelledAt?: number
  cancelledBy?: string
  plannedAt?: number
  planCounts?: {
    [key: string]: {
      [key: string]: number
    }
  }
  tasks: {
    total: number
    done: number
    failed: string[]
  }
  held?: boolean
}
GET/v1/platform/orgs

Platform organizations and the newest customer organizations.

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

Response 200

{
  orgs: {
    name: string
    createdAt?: number
    updatedAt?: number
    orgId: string
    slug: string
    kind: "platform" | "customer"
    planId?: string
    subsidised?: boolean
    billingRequired?: boolean
    pending?: boolean
    auditExportBucketId?: string
    logoUri?: string
    contactEmail?: string
    authStrength?: "any" | "mfa" | "passkey"
    authMethods?: string[]
    authGraceUntil?: number
    sessionHours?: number
    externalSharing?: "off" | "accounts" | "links"
    allowedDomains?: string[]
    linkMaxDays?: number
    assistantEnabled?: boolean
    assistantMaxMode?: "ask" | "reads" | "app" | "auto"
    assistantApps?: string[]
    assistantPublicShares?: boolean
    hiddenApps?: string[]
    formerSlugs?: string[]
    slugChangedAt?: number
    hostSlug?: string
  }[]
}
POST/v1/platform/orgs

Onboards a customer: the org (slug claimed atomically, optional plan) and an owner invite. The invite link is in the response once (and mailed where SES is set up); the owner joins through ID.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • namestringrequired

    1–64 characters. Trimmed.

  • slugstringrequired

    Matches ^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){1,38}$. Trimmed.

  • ownerEmailstringrequired

    Up to 254 characters. Email address.

  • planIdstringor null

    Matches ^[a-z0-9][a-z0-9-]{1,62}$.

  • subsidisedboolean

    Default false.

Errors

  • 400Unknown plan
  • 403Onboarding needs a signed-in admin.
curl -X POST 'https://api.cactive.com.au/v1/platform/orgs' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Example",
    "slug": "example",
    "ownerEmail": "person@example.com"
  }'
Send it from this page with your session or a key.

Response 201

{
  org: {
    name: string
    createdAt?: number
    updatedAt?: number
    orgId: string
    slug: string
    kind: "platform" | "customer"
    planId?: string
    subsidised?: boolean
    billingRequired?: boolean
    pending?: boolean
    auditExportBucketId?: string
    logoUri?: string
    contactEmail?: string
    authStrength?: "any" | "mfa" | "passkey"
    authMethods?: string[]
    authGraceUntil?: number
    sessionHours?: number
    externalSharing?: "off" | "accounts" | "links"
    allowedDomains?: string[]
    linkMaxDays?: number
    assistantEnabled?: boolean
    assistantMaxMode?: "ask" | "reads" | "app" | "auto"
    assistantApps?: string[]
    assistantPublicShares?: boolean
    hiddenApps?: string[]
    formerSlugs?: string[]
    slugChangedAt?: number
    hostSlug?: string
  }
  invite: {
    inviteId: string
    email: string
    link: string
    delivered: boolean
    expiresAt: number
  }
}
PATCH/v1/platform/orgs/:orgId

Assigns an organization to a plan (planId; null returns it to the default plan) and/or sets whether the platform pays for it (subsidised: every app, no card). Ending a subsidy makes the organization subscribe in Tenant → Billing before its apps open again.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • planIdstringor null

    Matches ^[a-z0-9][a-z0-9-]{1,62}$.

  • subsidisedboolean

Errors

  • 400Unknown plan
  • 404Organization not found
curl -X PATCH 'https://api.cactive.com.au/v1/platform/orgs/{orgId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "planId": "<planId>",
    "subsidised": true
  }'
Send it from this page with your session or a key.

Response 200

{
  org: {
    name: string
    createdAt?: number
    updatedAt?: number
    orgId: string
    slug: string
    kind: "platform" | "customer"
    planId?: string
    subsidised?: boolean
    billingRequired?: boolean
    pending?: boolean
    auditExportBucketId?: string
    logoUri?: string
    contactEmail?: string
    authStrength?: "any" | "mfa" | "passkey"
    authMethods?: string[]
    authGraceUntil?: number
    sessionHours?: number
    externalSharing?: "off" | "accounts" | "links"
    allowedDomains?: string[]
    linkMaxDays?: number
    assistantEnabled?: boolean
    assistantMaxMode?: "ask" | "reads" | "app" | "auto"
    assistantApps?: string[]
    assistantPublicShares?: boolean
    hiddenApps?: string[]
    formerSlugs?: string[]
    slugChangedAt?: number
    hostSlug?: string
  }
}
GET/v1/platform/stats

Counts of organizations, customers, regions and locations.

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

Response 200

{
  orgs: number
  customers: number
  regions: number
  locations: number
}
GET/v1/platform/audit

The platform organization's audit log: registry and plan changes, onboarding and the platform organization's own activity.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Query parameters

  • cursorstring

    Up to 4,096 characters.

  • actionstring

    Matches ^[a-z_]{1,32}(\.[a-z_]{1,32})?$.

  • actorstring

    1–512 characters.

  • targetstring

    Matches ^[a-z_]{1,32}:[^\s]{1,512}$.

  • limitinteger

    Default 50. 1–100. Coerced from a string.

Errors

  • 400Invalid cursor
  • 403Missing scope platform:admin
curl 'https://api.cactive.com.au/v1/platform/audit' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  events: {
    eventId: string
    orgId: string
    action: string
    actor: {
      type: "user" | "key" | "device" | "system"
      id: string
      label?: string
    }
    target: {
      type: string
      id: string
      label?: string
    }
    metadata?: {
      [key: string]: unknown
    }
    ip?: string
    userAgent?: string
    createdAt: number
  }[]
  cursor: null | string
  retentionDays?: number
}
GET/v1/platform/oauth-clients

Self-registered (MCP) clients at ID: who registered what, how many people connected, last use.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Manage OAuth apps
curl 'https://api.cactive.com.au/v1/platform/oauth-clients' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  clients: {
    connections: number
    createdAt?: number
    lastUsedAt?: number
    expiresAt?: number
    logoUri?: string
    clientUri?: string
    clientId: string
    name: string
    redirectUris: string[]
  }[]
}
DELETE/v1/platform/oauth-clients/:clientId

Removes a self-registered client: its approvals and refresh tokens stop working at once (the token endpoint no longer knows the client); access tokens it holds last up to an hour.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Manage OAuth apps

Path parameters

  • clientId

    Sign-in client id (cli_…).

Errors

  • 404Client not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/oauth-clients/{clientId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/platform/regions

The region and location registry.

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

Response 200

{
  regions: {
    name: string
    status?: "active" | "disabled"
    createdAt?: number
    updatedAt?: number
    unavailable?: string[]
    regionId: string
  }[]
  locations: {
    label: string
    status?: "active" | "disabled" | "preview"
    createdAt?: number
    updatedAt?: number
    locationId: string
    isDefault?: boolean
    regions: string[]
    sortOrder?: number
  }[]
}
PUT/v1/platform/regions/:regionId

Creates or replaces a region. Services that ran from the cached registry see the change within a minute.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:infra in the platform organisation
Get an API key

Path parameters

  • regionId

    AWS region id, e.g. us-west-1.

Request body

  • namestringrequired

    1–100 characters.

  • status"active" | "disabled"

    Default "active".

  • unavailablestring[]

    Default []. Up to 100 items. Each up to 64 characters.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/regions/{regionId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Example"
  }'
Send it from this page with your session or a key.

Response 200

{
  region: {
    name: string
    status?: "active" | "disabled"
    createdAt?: number
    updatedAt?: number
    unavailable?: string[]
    regionId: string
  }
}
PUT/v1/platform/locations/:locationId

Creates or replaces a location with its ordered region list (primary first).

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:infra in the platform organisation
Get an API key

Path parameters

  • locationId

    Location id: a platform location, or under Maps an org's alert location (mlc_…).

Request body

  • labelstringrequired

    1–100 characters.

  • regionsstring[]required

    1–10 items. Each matches ^[a-z0-9][a-z0-9-]{1,62}$.

  • status"active" | "preview" | "disabled"

    Default "active".

  • isDefaultboolean

    Default false.

  • sortOrderinteger

    Default 0.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/locations/{locationId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "label": "Example",
    "regions": [
      "example"
    ]
  }'
Send it from this page with your session or a key.

Response 200

{
  location: {
    label: string
    status?: "active" | "disabled" | "preview"
    createdAt?: number
    updatedAt?: number
    locationId: string
    isDefault?: boolean
    regions: string[]
    sortOrder?: number
  }
}
GET/v1/platform/billing/signups

Pay first (docs/billing/README.md → Pay first): the funnel for the last 30 days (checkouts started, paid, details given, onboarding complete) and the sign-ups that paid but haven't finished (the pending orgs and people), newest first.

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

Response 200

{
  funnel: {
    day: string
    started: number
    paid: number
    named: number
    complete: number
  }[]
  pending: {
    signupId: string
    audience: "personal" | "business"
    planId: string
    email?: string
    orgName?: string
    orgId?: string
    next: "invite" | "done" | "account" | "pay" | "details" | "secure"
    paidAt?: number
    createdAt: number
    remindersSent: number
  }[]
}
GET/v1/platform/billing/promotions

Promotion codes (docs/billing/promotions.md): the codes and coupons in the stage's payment provider, the subscriptions carrying a discount now, who may create codes, and whether this person may.

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

Response 200

{
  discounted: {
    ownerId: string
    ownerType: "user" | "org"
    ownerName?: string
    planId?: string
    interval?: "month" | "two-year" | "year"
    status: string
    subscriptionId?: string
    discount: {
      percentOff?: number
      amountOff?: number
      currency?: string
      duration: "once" | "repeating" | "forever"
      durationInMonths?: number
      code?: string
      name?: string
      startsAt?: number
      endsAt?: number
    }
  }[]
  creators: {
    roles: ("owner" | "admin" | "developer" | "viewer")[]
    emails: string[]
  }
  canCreate: boolean
  mode: "local" | "live" | "test"
  codes: {
    promotionCodeId: string
    code: string
    active: boolean
    couponId: string
    name?: string
    discount: {
      percentOff?: number
      amountOff?: number
      currency?: string
      duration: "once" | "repeating" | "forever"
      durationInMonths?: number
    }
    usable: boolean
    timesRedeemed: number
    maxRedemptions?: number
    expiresAt?: number
    firstTimeOnly: boolean
    minimumAmount?: number
    planIds?: string[]
    intervals?: ("month" | "two-year" | "year")[]
    email?: string
    ownerId?: string
    customerId?: string
    createdAt: number
    createdBy?: string
  }[]
  coupons: {
    createdAt: number
    planIds?: string[]
    discount: {
      percentOff?: number
      amountOff?: number
      currency?: string
      duration: "once" | "repeating" | "forever"
      durationInMonths?: number
    }
    valid: boolean
    timesRedeemed: number
    name?: string
    couponId: string
  }[]
}
POST/v1/platform/billing/promotions

Makes a code (and its coupon, unless couponId names one). Who may: billing.promotionCreators.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • codestringrequired

    3–40 characters. Trimmed.

  • namestring

    Up to 80 characters. Trimmed.

  • couponIdstring

    Matches ^[A-Za-z0-9_-]{1,100}$.

  • percentOffinteger

    1–100.

  • amountOffinteger

    ≥ 1.

  • duration"once" | "repeating" | "forever"
  • durationInMonthsinteger

    1–36.

  • maxRedemptionsinteger

    1–1000000.

  • expiresAtinteger

    > 0.

  • planIdsstring[]

    Up to 20 items. Each matches ^[a-z0-9][a-z0-9-]{1,62}$.

  • intervals("two-year" | "year" | "month")[]

    Up to 3 items.

  • emailstring

    Up to 254 characters. Email address.

  • ownerIdstring

    Matches ^(org|usr)_[A-Za-z0-9]{6,40}$.

  • firstTimeOnlyboolean
  • minimumAmountinteger

    ≥ 1.

Errors

  • 403You can't create promotion codes. Ask a platform owner (Admin → Promotions).
curl -X POST 'https://api.cactive.com.au/v1/platform/billing/promotions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "code": "example"
  }'
Send it from this page with your session or a key.

Response 201

{
  code: {
    promotionCodeId: string
    code: string
    active: boolean
    couponId: string
    name?: string
    discount: {
      percentOff?: number
      amountOff?: number
      currency?: string
      duration: "once" | "repeating" | "forever"
      durationInMonths?: number
    }
    usable: boolean
    timesRedeemed: number
    maxRedemptions?: number
    expiresAt?: number
    firstTimeOnly: boolean
    minimumAmount?: number
    planIds?: string[]
    intervals?: ("month" | "two-year" | "year")[]
    email?: string
    ownerId?: string
    customerId?: string
    createdAt: number
    createdBy?: string
  }
}
PATCH/v1/platform/billing/promotions/:promotionCodeId

Turns a code off (or on again): no new redemptions; discounts already given keep running.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • promotionCodeId

    A promotion code's id (the payment provider's, promo_…).

Request body

  • activebooleanrequired

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
  • 403You can't change promotion codes.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/billing/promotions/{promotionCodeId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "active": true
  }'
Send it from this page with your session or a key.

Response 200

{
  code: {
    promotionCodeId: string
    code: string
    active: boolean
    couponId: string
    name?: string
    discount: {
      percentOff?: number
      amountOff?: number
      currency?: string
      duration: "once" | "repeating" | "forever"
      durationInMonths?: number
    }
    usable: boolean
    timesRedeemed: number
    maxRedemptions?: number
    expiresAt?: number
    firstTimeOnly: boolean
    minimumAmount?: number
    planIds?: string[]
    intervals?: ("month" | "two-year" | "year")[]
    email?: string
    ownerId?: string
    customerId?: string
    createdAt: number
    createdBy?: string
  }
}
DELETE/v1/platform/billing/coupons/:couponId

Deletes a coupon: none of its codes can be redeemed any more; discounts already given keep running.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • couponId

    A coupon's id (the payment provider's).

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
  • 403You can't delete coupons.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/billing/coupons/{couponId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/platform/billing/redemptions

Redemptions, newest first: one code's (?promotionCodeId=) or all.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Query parameters

  • promotionCodeIdstring

Errors

  • 400Invalid code id
curl 'https://api.cactive.com.au/v1/platform/billing/redemptions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  redemptions: {
    promotionCodeId: string
    code: string
    ownerId: string
    ownerType: "user" | "org"
    ownerName?: string
    subscriptionId: string
    planId?: string
    interval?: "month" | "two-year" | "year"
    at: number
  }[]
}
PUT/v1/platform/billing/promotion-creators

Who may create codes: platform roles and people. Platform owners only.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • roles("owner" | "admin" | "developer" | "viewer")[]required

    Up to 4 items.

  • emailsstring[]required

    Up to 100 items. Each up to 254 characters, email address.

Errors

  • 403Only platform owners can change who creates codes.
curl -X PUT 'https://api.cactive.com.au/v1/platform/billing/promotion-creators' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "roles": [
      "owner"
    ],
    "emails": [
      "person@example.com"
    ]
  }'
Send it from this page with your session or a key.

Response 200

{
  creators: {
    roles: ("owner" | "admin" | "developer" | "viewer")[]
    emails: string[]
  }
}
GET/v1/platform/plans

Plans and their settings. Organizations without a plan use the default plan.

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

Response 200

{
  plans: {
    features?: string[]
    name: string
    createdAt?: number
    updatedAt?: number
    planId: string
    apps?: string[]
    audience?: "personal" | "business"
    tagline?: string
    isDefault?: boolean
    sortOrder?: number
    priceMonthly?: number
    priceAnnual?: number
    priceTwoYear?: number
    offered?: boolean
    trialDays?: number
    support?: string
    highlights?: string[]
    caityMessagesPerDay?: number
    auditRetentionDays: number
    mailSendPerDay?: number
    mailMaxMessageMb?: number
    mailMaxRecipients?: number
    maxConnectors?: number
    maxConnectorTools?: number
    driveStorageGb?: number
    driveStorageGbPerUser?: number
    drivePersonalStorageGb?: number
    vaultMaxItems?: number
    crmMaxRecords?: number
    marketingContacts?: number
    marketingSendsPerMonth?: number
    pipelineMinutes?: number
    pipelineOverage?: boolean
    pipelineConcurrency?: number
    pipelineMaxMinutes?: number
    pipelineLogDays?: number
    pipelineArtifactDays?: number
    pipelineArtifactGb?: number
    pipelineCacheGb?: number
    keysMax?: number
    keyOpsPerMonth?: number
    secretsMax?: number
    keyMonthlyPriceCents?: number
    keyOpsPer10kPriceCents?: number
  }[]
}
PUT/v1/platform/plans/:planId

Creates or replaces a plan. Optional limits that aren't sent keep their stored value; null clears one (the default applies). Making a plan the default clears the flag on the others.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • planId

    Plan id.

Request body

  • namestringrequired

    1–100 characters. Trimmed.

  • auditRetentionDaysintegerrequired

    1–3650.

  • isDefaultboolean

    Default false.

  • sortOrderinteger

    Default 0.

  • mailSendPerDayintegeror null

    0–1000000.

  • mailMaxMessageMbintegeror null

    1–40.

  • mailMaxRecipientsintegeror null

    1–1000.

  • maxConnectorsintegeror null

    0–1000.

  • maxConnectorToolsintegeror null

    0–1000.

  • driveStorageGbintegeror null

    0–1000000.

  • drivePersonalStorageGbintegeror null

    0–1000000.

  • vaultMaxItemsintegeror null

    0–1000000.

  • crmMaxRecordsintegeror null

    0–1000000000.

  • marketingContactsintegeror null

    0–100000000.

  • marketingSendsPerMonthintegeror null

    0–1000000000.

  • driveStorageGbPerUserintegeror null

    0–1000000.

  • audience"business" | "personal"

    Default "business".

  • taglinestringor null

    Up to 200 characters. Trimmed.

  • priceMonthlyintegeror null

    0–10000000.

  • priceAnnualintegeror null

    0–100000000.

  • priceTwoYearintegeror null

    0–200000000.

  • offeredbooleanor null
  • trialDaysintegeror null

    0–90.

  • apps[]or null

    Up to 50 items.

  • featuresstring[]or null

    Up to 50 items. Each matches ^[a-z0-9-]{1,40}$.

  • supportstringor null

    Up to 120 characters. Trimmed.

  • highlightsstring[]or null

    Up to 12 items. Each 1–120 characters, trimmed.

  • caityMessagesPerDayintegeror null

    0–100000.

  • pipelineMinutesintegeror null

    0–10000000.

  • pipelineOveragebooleanor null
  • pipelineConcurrencyintegeror null

    0–500.

  • pipelineMaxMinutesintegeror null

    1–2160.

  • pipelineLogDaysintegeror null

    1–400.

  • pipelineArtifactDaysintegeror null

    1–400.

  • pipelineArtifactGbintegeror null

    0–100000.

  • pipelineCacheGbintegeror null

    0–10000.

  • keysMaxintegeror null

    0–1000000.

  • keyOpsPerMonthintegeror null

    0–1000000000.

  • secretsMaxintegeror null

    0–1000000.

  • keyMonthlyPriceCentsintegeror null

    0–1000000.

  • keyOpsPer10kPriceCentsintegeror null

    0–1000000.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/plans/{planId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Example",
    "auditRetentionDays": 1
  }'
Send it from this page with your session or a key.

Response 200

{
  plan: {
    features?: string[]
    name: string
    createdAt?: number
    updatedAt?: number
    planId: string
    apps?: string[]
    audience?: "personal" | "business"
    tagline?: string
    isDefault?: boolean
    sortOrder?: number
    priceMonthly?: number
    priceAnnual?: number
    priceTwoYear?: number
    offered?: boolean
    trialDays?: number
    support?: string
    highlights?: string[]
    caityMessagesPerDay?: number
    auditRetentionDays: number
    mailSendPerDay?: number
    mailMaxMessageMb?: number
    mailMaxRecipients?: number
    maxConnectors?: number
    maxConnectorTools?: number
    driveStorageGb?: number
    driveStorageGbPerUser?: number
    drivePersonalStorageGb?: number
    vaultMaxItems?: number
    crmMaxRecords?: number
    marketingContacts?: number
    marketingSendsPerMonth?: number
    pipelineMinutes?: number
    pipelineOverage?: boolean
    pipelineConcurrency?: number
    pipelineMaxMinutes?: number
    pipelineLogDays?: number
    pipelineArtifactDays?: number
    pipelineArtifactGb?: number
    pipelineCacheGb?: number
    keysMax?: number
    keyOpsPerMonth?: number
    secretsMax?: number
    keyMonthlyPriceCents?: number
    keyOpsPer10kPriceCents?: number
  }
}
GET/v1/platform/office-templates

Built-in templates of Documents, Sheets and Slides (Admin → Templates): every one, hidden ones included.

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

Response 200

{
  templates: {
    templateId: string
    kind: "video" | "document" | "spreadsheet" | "presentation"
    name: string
    category?: string
    sortOrder?: number
    hidden?: boolean
  }[]
}
GET/v1/platform/video-presets

Video's export presets (Admin → Templates → Video presets): every one, hidden ones included.

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

Response 200

{
  presets: {
    id: string
    label: string
    description?: string
    settings: {
      container: "mp4" | "webm"
      video: null | {
        codec: "av1" | "avc" | "hevc" | "vp9"
        width: number
        height: number
        frameRate: {
          num: number
          den: number
        }
        bitrate: number
        bitrateMode: "variable" | "constant"
        keyframeEvery: number
        profile?: string
        hardware: "no-preference" | "prefer-hardware" | "prefer-software"
      }
      audio: null | {
        codec: "aac" | "opus"
        sampleRate: 48000 | 44100
        channels: 2 | 1
        bitrate: number
      }
      timecodeOverlay?: boolean
      loudness?: null | {
        target: number
        truePeak: number
      }
    }
    sortOrder: number
    hidden: boolean
    builtIn: boolean
  }[]
}
PUT/v1/platform/video-presets/:presetId

Changes an export preset's label, description, settings, order or visibility, or adds one; the app sees it within a minute.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • presetId

    Aircraft preset id (lowercase letters, digits, - and _); under video-presets, a video export preset's id (h264-1080p).

Request body

  • labelstring

    1–80 characters. Trimmed.

  • descriptionstringor null

    Up to 200 characters. Trimmed.

  • sortOrderinteger

    -1000–10000.

  • hiddenboolean
  • settingsobject
  • settings.container"mp4" | "webm"required
  • settings.videoobjectrequiredor null
  • settings.video.codec"avc" | "hevc" | "vp9" | "av1"required
  • settings.video.widthintegerrequired

    0–16384.

  • settings.video.heightintegerrequired

    0–16384.

  • settings.video.frameRateobjectrequired
  • settings.video.frameRate.numintegerrequired

    0–240000.

  • settings.video.frameRate.denintegerrequired

    1–1001.

  • settings.video.bitrateintegerrequired

    100000–500000000.

  • settings.video.bitrateMode"variable" | "constant"required
  • settings.video.keyframeEveryintegerrequired

    ≥ 0.

  • settings.video.profilestring

    Up to 40 characters.

  • settings.video.hardware"no-preference" | "prefer-hardware" | "prefer-software"required
  • settings.audioobjectrequiredor null
  • settings.audio.codec"aac" | "opus"required
  • settings.audio.sampleRate48000 | 44100required
  • settings.audio.channels1 | 2required
  • settings.audio.bitrateintegerrequired

    16000–1000000.

  • settings.timecodeOverlayboolean
  • settings.loudnessobjector null
  • settings.loudness.targetnumberrequired

    -40–0.

  • settings.loudness.truePeaknumberrequired

    -10–0.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/video-presets/{presetId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "label": "Example",
    "description": "example",
    "sortOrder": 1
  }'
Send it from this page with your session or a key.

Response 200

{
  preset: {
    id: string
    label: string
    description?: string
    settings: {
      container: "mp4" | "webm"
      video: null | {
        codec: "av1" | "avc" | "hevc" | "vp9"
        width: number
        height: number
        frameRate: {
          num: number
          den: number
        }
        bitrate: number
        bitrateMode: "variable" | "constant"
        keyframeEvery: number
        profile?: string
        hardware: "no-preference" | "prefer-hardware" | "prefer-software"
      }
      audio: null | {
        codec: "aac" | "opus"
        sampleRate: 48000 | 44100
        channels: 2 | 1
        bitrate: number
      }
      timecodeOverlay?: boolean
      loudness?: null | {
        target: number
        truePeak: number
      }
    }
    sortOrder: number
    hidden: boolean
    builtIn: boolean
  }
}
GET/v1/platform/office-fonts

The editors' fonts (Admin → Fonts): every family, hidden ones included, and whether the stage has the files.

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

Response 200

{
  fonts: {
    family: string
    category: "serif" | "mono" | "display" | "sans"
    sortOrder: number
    hidden: boolean
    standIn: boolean
  }[]
  hosted: boolean
}
PATCH/v1/platform/office-fonts/:family

Recategorises, orders or hides a font; the menus see it within a minute.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • family

    A font family's name as the catalogue lists it (Open Sans), URL-encoded.

Request body

  • category"sans" | "serif" | "mono" | "display"
  • sortOrderinteger

    -1000–10000.

  • hiddenboolean

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/office-fonts/{family}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "category": "sans",
    "sortOrder": 1,
    "hidden": true
  }'
Send it from this page with your session or a key.

Response 200

{
  font: {
    hidden: boolean
    sortOrder: number
    category: "serif" | "mono" | "display" | "sans"
    family: string
    standIn: boolean
  }
}
PATCH/v1/platform/office-templates/:templateId

Renames, recategorises, orders or hides a built-in template; the galleries see it within a minute.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • templateId

    A Marketing template's id (tpl_…).

Request body

  • namestring

    1–80 characters. Trimmed.

  • categorystringor null

    Up to 40 characters. Trimmed.

  • sortOrderinteger

    -1000–1000.

  • hiddenboolean

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PATCH 'https://api.cactive.com.au/v1/platform/office-templates/{templateId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Example",
    "category": "example",
    "sortOrder": 1
  }'
Send it from this page with your session or a key.

Response 200

{
  template: {
    hidden: boolean
    sortOrder: number
    templateId: string
    kind: "video" | "document" | "spreadsheet" | "presentation"
    name: string
    category?: string
  }
}
GET/v1/platform/models

Chat models and the capabilities that shape their requests. Chat reads them within the cache TTL.

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

Response 200

{
  models: {
    region?: string
    label: string
    createdAt?: number
    updatedAt?: number
    api?: "anthropic" | "converse"
    description?: string
    thinking?: "none" | "adaptive" | "budget"
    effort?: "low" | "medium" | "high" | "max" | "xhigh"
    documents?: boolean
    enabled?: boolean
    caity?: boolean
    isDefault?: boolean
    sortOrder?: number
    modelId: string
    thinkingBudget?: number
    maxTokens: number
    eagerToolInput?: boolean
    fallbackModelIds?: string[]
    fallbackModelId?: string
    compactAt?: number
    titles?: boolean
    crossRegion?: boolean
    accessFallback?: boolean
    lane?: "fast" | "balanced" | "deep"
    laneDefault?: boolean
    vision?: boolean
    contextTokens?: number
    price?: unknown
    plans?: string[]
  }[]
}
PUT/v1/platform/models/:modelId

Creates or replaces a chat model in the catalog: label, whether it's enabled or the default, thinking and effort settings, output tokens and fallback model. Making a model the default clears the flag on the others.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • modelId

    Bedrock base model id, e.g. anthropic.claude-opus-5-5.

Request body

  • labelstringrequired

    1–100 characters. Trimmed.

  • descriptionstring

    Default "". Up to 120 characters. Trimmed.

  • enabledboolean

    Default true.

  • isDefaultboolean

    Default false.

  • sortOrderinteger

    Default 0.

  • thinking"adaptive" | "budget" | "none"

    Default "adaptive".

  • thinkingBudgetintegeror null

    1024–128000.

  • effort"low" | "medium" | "high" | "xhigh" | "max"or null
  • maxTokensintegerrequired

    1024–128000.

  • eagerToolInputboolean

    Default true.

  • fallbackModelIdsstring[]

    Up to 8 items. Each matches ^[a-z0-9][a-z0-9.:-]{2,127}$.

  • fallbackModelIdstringor null

    Matches ^[a-z0-9][a-z0-9.:-]{2,127}$.

  • compactAtintegeror null

    50000–1000000.

  • titlesboolean
  • api"anthropic" | "converse"
  • regionstringor null

    Matches ^[a-z]{2}(-[a-z]+)+-\d$. Trimmed.

  • crossRegionboolean
  • accessFallbackboolean
  • caityboolean
  • lane"fast" | "balanced" | "deep"or null
  • laneDefaultboolean
  • visionboolean
  • documentsboolean
  • contextTokensintegeror null

    8000–10000000.

  • priceobjector null
  • price.inputnumberrequired

    0–1000.

  • price.outputnumberrequired

    0–1000.

  • price.cacheReadnumber

    0–1000.

  • price.cacheWritenumber

    0–1000.

  • price.longAboveinteger

    ≥ 1000.

  • price.longInputnumber

    0–1000.

  • price.longOutputnumber

    0–1000.

  • plansstring[]

    Up to 20 items. Each 1–40 characters, trimmed.

Also checked: Caity's models use the Messages API Budget thinking needs a thinking budget below the max tokens The default model must be enabled

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
  • 400A model can't fall back to itself
  • 400A fallback is listed twice
  • 400Unknown fallback model
  • 400Set another model as the default first
  • 400Caity's models use the Messages API
curl -X PUT 'https://api.cactive.com.au/v1/platform/models/{modelId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "label": "Example",
    "maxTokens": 1
  }'
Send it from this page with your session or a key.

Response 200

{
  model: {
    region?: string
    label: string
    createdAt?: number
    updatedAt?: number
    api?: "anthropic" | "converse"
    description?: string
    thinking?: "none" | "adaptive" | "budget"
    effort?: "low" | "medium" | "high" | "max" | "xhigh"
    documents?: boolean
    enabled?: boolean
    caity?: boolean
    isDefault?: boolean
    sortOrder?: number
    modelId: string
    thinkingBudget?: number
    maxTokens: number
    eagerToolInput?: boolean
    fallbackModelIds?: string[]
    fallbackModelId?: string
    compactAt?: number
    titles?: boolean
    crossRegion?: boolean
    accessFallback?: boolean
    lane?: "fast" | "balanced" | "deep"
    laneDefault?: boolean
    vision?: boolean
    contextTokens?: number
    price?: unknown
    plans?: string[]
  }
}
GET/v1/platform/flight-coverage

Areas the Maps flight poller always covers (centre, radius, label, enabled), besides watches and areas people are viewing.

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

Response 200

{
  areas: {
    label: string
    createdAt?: number
    updatedAt?: number
    lat: number
    lon: number
    enabled?: boolean
    sortOrder?: number
    areaId: string
    radiusNm: number
  }[]
}
PUT/v1/platform/flight-coverage/:areaId

Creates or replaces a standing coverage area. The poller picks it up within a minute; radius is capped at the ADS-B source's maximum.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • areaId

    Standing coverage area id.

Request body

  • labelstringrequired

    1–64 characters. Trimmed.

  • latnumberrequired

    -90–90.

  • lonnumberrequired

    -180–180.

  • radiusNmnumberrequired

    5–250.

  • enabledboolean

    Default true.

  • sortOrderinteger

    Default 0.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/flight-coverage/{areaId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "label": "Example",
    "lat": 1,
    "lon": 1,
    "radiusNm": 1
  }'
Send it from this page with your session or a key.

Response 200

{
  area: {
    label: string
    createdAt?: number
    updatedAt?: number
    lat: number
    lon: number
    enabled?: boolean
    sortOrder?: number
    areaId: string
    radiusNm: number
  }
}
GET/v1/platform/flight-sources

Maps: the ADS-B sources the flight poller uses, in order (seeded adsb.lol, adsb.fi, ADS-B Exchange as a capped last resort). The poller reads them within the cache TTL.

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

Response 200

{
  sources: {
    createdAt?: number
    updatedAt?: number
    sourceId: string
    enabled?: boolean
    sortOrder?: number
    use?: "all" | "last_resort"
    dailyRequests?: number
    monthlyRequests?: number
  }[]
  known: {
    sourceId: "adsblol" | "adsbfi" | "airplaneslive" | "opensky" | "adsbexchange"
    label: string
    terms: string
    maxRadiusNm: number
    rate: {
      burst: number
      perMinute: number
    }
  }[]
}
PUT/v1/platform/flight-sources/:sourceId

Changes an ADS-B source: its place in the order, whether it's used, and its daily and monthly request budgets.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • sourceId

    ADS-B source id (adsblol, adsbfi, adsbexchange, …).

Request body

  • enabledboolean

    Default true.

  • sortOrderinteger

    Default 0.

  • use"all" | "last_resort"

    Default "all".

  • dailyRequestsinteger

    0–100000.

  • monthlyRequestsinteger

    0–10000000.

Errors

  • 400Unknown source; one of …
curl -X PUT 'https://api.cactive.com.au/v1/platform/flight-sources/{sourceId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "enabled": true,
    "sortOrder": 0,
    "use": "all"
  }'
Send it from this page with your session or a key.

Response 200

{
  source: {
    createdAt?: number
    updatedAt?: number
    sourceId: string
    enabled?: boolean
    sortOrder?: number
    use?: "all" | "last_resort"
    dailyRequests?: number
    monthlyRequests?: number
  }
}
GET/v1/platform/deploys

Maps: Admin's "SMS for Maps alerts" switch (the maps.sms row, off by default). Off, the notifications service sends no Maps alert by text or call (docs/platform/notifications.md → Maps texts); containers see a change within 30 seconds.

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

Response 200

{
  stages: {
    [key: string]: {
      commit: string
      at: number
    }
  }
  updatedAt: null | number
}
GET/v1/platform/maps/sms

The SMS for Maps alerts switch (settings.on, off by default) and when and by whom it last changed. Off, no Maps alert texts or calls anyone. Platform staff only.

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

Response 200

{
  settings: {
    on: boolean
  }
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/maps/sms

Turns SMS for Maps alerts on or off (on). Applies within 30 seconds; saved text choices on watches, zones and people's settings are kept. Audited. Platform staff only.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • onbooleanrequired

Errors

  • 403This switch is changed by people.
curl -X PUT 'https://api.cactive.com.au/v1/platform/maps/sms' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "on": true
  }'
Send it from this page with your session or a key.

Response 200

{
  settings: {
    on: boolean
  }
  updatedAt: null | number
  updatedBy: null | string
}
GET/v1/platform/incident-sources

Maps: the emergency feeds the incidents poller reads, in order (rows: the seed's until one is saved), the parsers it knows (formats) and how each feed did last (status, from the live picture). The poller reads them within the cache TTL.

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

Response 200

{
  sources: {
    url: string
    format: string
    label: string
    state: string
    attribution: string
    sourceId: string
    enabled: boolean
    sortOrder: number
    pollSeconds: number
    licence: string
    licenceUrl?: string
    homepage?: string
    dedupe: boolean
  }[]
  saved: boolean
  formats: {
    id: string
    label: string
  }[]
  status: {
    sourceId: string
    label: string
    state: "ACT" | "NSW" | "NT" | "QLD" | "SA" | "TAS" | "VIC" | "WA" | "AU"
    attribution: string
    licence: string
    licenceUrl?: string
    homepage?: string
    count: number
    ok: boolean
    checkedAt?: number
    changedAt?: number
    error?: string
  }[]
  updatedAt: null | number
}
PUT/v1/platform/incident-sources/:sourceId

Adds or changes an emergency feed: label, parser (format), https URL, state, order, on or off, poll interval (30–3,600 s), credit line, licence and the agency's page. The first save also writes the seed's other feeds so they stay in use.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • sourceId

    ADS-B source id (adsblol, adsbfi, adsbexchange, …).

Request body

  • labelstringrequired

    1–80 characters. Trimmed.

  • formatstringrequired

    Up to 40 characters.

  • urlstringrequired

    Up to 1,000 characters. URL.

  • state"ACT" | "NSW" | "NT" | "QLD" | "SA" | "TAS" | "VIC" | "WA" | "AU"required
  • enabledboolean

    Default true.

  • sortOrderinteger

    Default 0.

  • pollSecondsinteger

    Default 60. 30–3600.

  • attributionstringrequired

    1–300 characters. Trimmed.

  • licencestringrequired

    1–120 characters. Trimmed.

  • licenceUrlstring

    Up to 500 characters. URL.

  • homepagestring

    Up to 500 characters. URL.

  • dedupeboolean

    Default true.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
  • 400Unknown format; one of …
  • 400Feeds are read over https.
curl -X PUT 'https://api.cactive.com.au/v1/platform/incident-sources/{sourceId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "label": "Example",
    "format": "example",
    "url": "https://example.com",
    "state": "ACT",
    "attribution": "example",
    "licence": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  source: {
    url: string
    format: string
    label: string
    createdAt?: number
    updatedAt?: number
    state: string
    attribution: string
    sourceId: string
    enabled?: boolean
    sortOrder?: number
    pollSeconds?: number
    licence: string
    licenceUrl?: string
    homepage?: string
    dedupe?: boolean
  }
}
DELETE/v1/platform/incident-sources/:sourceId

Removes an emergency feed. Its incidents leave the map at the next poll without alerting anyone.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • sourceId

    ADS-B source id (adsblol, adsbfi, adsbexchange, …).

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/incident-sources/{sourceId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/platform/limits

Maps: aircraft presets watches target ({ kind: "preset", value: <presetId> }), e.g. police and emergency callsigns. Targets are hex, registration, callsign or type, * for prefixes. The poller reads them within the cache TTL.

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

Response 200

{
  limits: {
    value: null | number
    updatedAt: null | number
    id: string
    group: string
    label: string
    description?: string
    default: number
    min: number
    max: number
    step?: number
  }[]
}
PUT/v1/platform/limits/:limitId

Sets a limit (null: back to its default). Readers see it within a minute.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • limitId

    A limit's id, e.g. mirage.discord.historyMax.

Request body

  • valuenumberrequiredor null

Errors

  • 400…: between … and …….
  • 404Unknown limit
curl -X PUT 'https://api.cactive.com.au/v1/platform/limits/{limitId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "value": 1
  }'
Send it from this page with your session or a key.

Response 200

{
  limit: {
    value: null | number
    updatedAt: number
    id: string
    group: string
    label: string
    description?: string
    default: number
    min: number
    max: number
    step?: number
  }
}
GET/v1/platform/marketing/sms-prices

What a Marketing text part costs per destination (currency, prices of prefix, country, perPart): the prices in force, the built-in ones, and whether any are stored. Platform staff (platform:admin).

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

Response 200

{
  prices: {
    currency: string
    prices: {
      prefix: string
      country: string
      perPart: number
    }[]
  }
  defaults: {
    currency: string
    prices: {
      prefix: string
      country: string
      perPart: number
    }[]
  }
  stored: boolean
  updatedAt: null | number
  updatedBy: null | string
}
PUT/v1/platform/marketing/sms-prices

Replaces the text prices (prices; null puts the built-in ones back). Journeys' text steps show costs from them within a minute. Audited. Platform staff.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • pricesobjectrequiredor null
  • prices.currencystringrequired

    Matches ^[A-Z]{3}$.

  • prices.pricesobject[]required

    Up to 300 items.

  • prices.prices[].prefixstringrequired

    Matches ^\+[1-9]\d{0,5}$.

  • prices.prices[].countrystringrequired

    1–60 characters. Trimmed.

  • prices.prices[].perPartnumberrequired

    0–5.

curl -X PUT 'https://api.cactive.com.au/v1/platform/marketing/sms-prices' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "prices": {
      "currency": "example",
      "prices": [
        {
          "prefix": "example",
          "country": "example",
          "perPart": 1
        }
      ]
    }
  }'
Send it from this page with your session or a key.

Response 200

{
  prices: {
    currency: string
    prices: {
      prefix: string
      country: string
      perPart: number
    }[]
  }
  defaults: {
    currency: string
    prices: {
      prefix: string
      country: string
      perPart: number
    }[]
  }
  stored: boolean
  updatedAt: null | number
  updatedBy: null | string
}
GET/v1/platform/aircraft-presets

Aircraft presets flight watches can target ({ kind: "preset", value: <presetId> }): label, targets ({ kind: hex | registration | callsign | type, value }, * for prefixes), enabled, sortOrder.

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

Response 200

{
  presets: {
    targets: unknown
    label: string
    createdAt?: number
    updatedAt?: number
    enabled?: boolean
    sortOrder?: number
    presetId: string
  }[]
}
PUT/v1/platform/aircraft-presets/:presetId

Creates or replaces an aircraft preset (label, targets, enabled, sortOrder). Watches that use it pick it up within a minute.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • presetId

    Aircraft preset id (lowercase letters, digits, - and _); under video-presets, a video export preset's id (h264-1080p).

Request body

  • labelstringrequired

    1–64 characters. Trimmed.

  • targetsobject[]required

    1–200 items.

  • targets[].kind"hex" | "registration" | "callsign" | "type"required
  • targets[].valuestringrequired

    1–16 characters. Matches ^[A-Za-z0-9~*-]+$. Trimmed.

  • enabledboolean

    Default true.

  • sortOrderinteger

    Default 0.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/aircraft-presets/{presetId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "label": "Example",
    "targets": [
      {
        "kind": "hex",
        "value": "example"
      }
    ]
  }'
Send it from this page with your session or a key.

Response 200

{
  preset: {
    targets: {
      kind: "type" | "hex" | "callsign" | "registration"
      value: string
    }[]
    label: string
    createdAt?: number
    updatedAt?: number
    enabled?: boolean
    sortOrder?: number
    presetId: string
  }
}
DELETE/v1/platform/aircraft-presets/:presetId

Removes an aircraft preset; watches that named it stop matching through it.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • presetId

    Aircraft preset id (lowercase letters, digits, - and _); under video-presets, a video export preset's id (h264-1080p).

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
  • 404Preset not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/aircraft-presets/{presetId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/platform/mail-category-rules

Rules that sort received mail into inbox categories, in order: match (domain, local, subject or header), value, category (primary, transactions, updates, promotions), enabled, sortOrder.

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

Response 200

{
  rules: {
    value: string
    createdAt?: number
    updatedAt?: number
    match: "header" | "subject" | "domain" | "local"
    ruleId: string
    category: "primary" | "transactions" | "updates" | "promotions"
    enabled?: boolean
    sortOrder?: number
  }[]
}
POST/v1/platform/mail-category-rules/test

Classifies a pasted message with the saved rules, exactly as delivery would for a sender the mailbox doesn't know: pasted headers (or a whole message), or From and Subject.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • headersstring

    Up to 64,000 characters.

  • fromstring

    Up to 320 characters.

  • subjectstring

    Up to 998 characters.

Also checked: Paste headers, or give a From address or a subject.

curl -X POST 'https://api.cactive.com.au/v1/platform/mail-category-rules/test' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "headers": "example",
    "from": "example",
    "subject": "Example"
  }'
Send it from this page with your session or a key.

Response 200

{
  result: {
    category: "primary" | "transactions" | "updates" | "promotions"
    reason: string
    from: string
    subject: string
    domain: string
    local: string
    bulk: boolean
    rule?: {
      ruleId: string
      match: "header" | "subject" | "domain" | "local"
      value: string
      category: "primary" | "transactions" | "updates" | "promotions"
      enabled: boolean
      sortOrder: number
    }
  }
}
PUT/v1/platform/mail-category-rules/:ruleId

Creates or replaces a mail category rule. Mail received from then on (within a minute) follows it; mail already received keeps its category.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • ruleId

    Rule id: a storage lifecycle rule (as returned by the settings or lifecycle routes), an issue automation rule (rul_…) or a Mirage AutoMod rule (mar_…).

Request body

  • match"domain" | "local" | "subject" | "header"required
  • valuestringrequired

    1–120 characters. Trimmed. Lowercased.

  • category"primary" | "transactions" | "updates" | "promotions"required
  • enabledboolean

    Default true.

  • sortOrderinteger

    Default 0.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
curl -X PUT 'https://api.cactive.com.au/v1/platform/mail-category-rules/{ruleId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "match": "domain",
    "value": "example",
    "category": "primary"
  }'
Send it from this page with your session or a key.

Response 200

{
  rule: {
    value: string
    createdAt?: number
    updatedAt?: number
    match: "header" | "subject" | "domain" | "local"
    ruleId: string
    category: "primary" | "transactions" | "updates" | "promotions"
    enabled?: boolean
    sortOrder?: number
  }
}
DELETE/v1/platform/mail-category-rules/:ruleId

Removes a mail category rule.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • ruleId

    Rule id: a storage lifecycle rule (as returned by the settings or lifecycle routes), an issue automation rule (rul_…) or a Mirage AutoMod rule (mar_…).

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
  • 404Rule not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/mail-category-rules/{ruleId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/platform/mail-lends

Mail domains lent out of the shared platform zone, each with its org and how far Mail has got with it (Admin → Mail → Lent Domains; docs/mail/README.md → Lent domains). parent: the name this stage lends under.

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

Response 200

{
  parent: string
  lends: {
    mail: null | {
      status: "error" | "active" | "pending" | "verifying"
      orgId: string
    }
    createdAt?: number
    updatedAt?: number
    orgId: string
    domain: string
    purpose: string
    addedBy: string
    addedByLabel?: string
  }[]
}
POST/v1/platform/mail-lends

Lends one name to one org for Mail. Never replaces a lend: take it back first.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Request body

  • domainstringrequired

    Up to 253 characters. Trimmed. Lowercased.

  • orgIdstringrequired

    1–64 characters. Trimmed.

  • purposestringrequired

    1–200 characters. Trimmed.

Errors

  • 400No organisation has that id.
  • 409… is already a Mail domain.
  • 409… is lent already.
curl -X POST 'https://api.cactive.com.au/v1/platform/mail-lends' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "domain": "example",
    "orgId": "<orgId>",
    "purpose": "example"
  }'
Send it from this page with your session or a key.

Response 201

{
  lend: {
    createdAt?: number
    updatedAt?: number
    orgId: string
    domain: string
    purpose: string
    addedBy: string
    addedByLabel?: string
  }
}
DELETE/v1/platform/mail-lends/:domain

Takes a lend back once its org no longer has the domain in Mail (removing it there deletes its records).

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • domain

    The mail domain, e.g. example.com.

Errors

  • 404Lend not found
  • 409The organisation still has … in Mail. It's removed in Mail → Settings → Domains first, which deletes its records.
curl -X DELETE 'https://api.cactive.com.au/v1/platform/mail-lends/{domain}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
DELETE/v1/platform/flight-coverage/:areaId

Removes a standing coverage area.

Auth
A person's token or an API key, as Authorization: Bearer.
Scope
platform:admin in the platform organisation
Get an API key

Path parameters

  • areaId

    Standing coverage area id.

Errors

  • 400Invalid id: lowercase letters, digits and hyphens.
  • 404Coverage area not found
curl -X DELETE 'https://api.cactive.com.au/v1/platform/flight-coverage/{areaId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}