API reference
Notifications and protocols
/ v1/ me/ notifications/ devicesThe app's push registrations on your phones (deviceId is the phone's install id; rows of the withdrawn product apps too, until they're removed), with appId, platform, and the name, model, osVersion and appVersion the app sent. No push tokens.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Notifications belong to people.
curl 'https://api.cactive.com.au/v1/me/notifications/devices' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
devices: {
deviceId: string
appId: string
platform: "ios" | "android"
name?: string
model?: string
osVersion?: string
appVersion?: string
createdAt?: number
updatedAt?: number
}[]
}/ v1/ me/ notifications/ devices/ :deviceIdRegisters or refreshes a mobile app's Expo push token on this phone (token, platform, appId, optional name, model, osVersion, appVersion, and opensSealed from an Android build that decrypts end-to-end pushes itself, which then gets them as data-only messages). A mobile app's token ties the registration to its sign-in, so signing the app out removes it, and appId must be that app. People only, not assistants. Only the one app (appId home) registers: a withdrawn product app gets 410.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
deviceIdDevice id: an agent's (
dev_…); under/v1/me/notificationsa phone's install id; under/v1/me/sign-in-approvalsa phone that approves sign-ins (apd_…); under/v1/me/vaultthe id a device made for its vault, and under/v1/me/browser-syncthe id a browser made for sync (22 base64url characters).
Request body
tokenstringrequiredplatform"ios" | "android"requiredappId"home" | "caity" | "tasks" | "brain" | "mail" | "drive" | "photos" | "git" | "cloud" | "maps" | "tenant" | "admin" | "account" | "authenticator" | "mirage" | "health" | "weather" | "marketing" | "crm" | "food" | "vehicles"Default
"caity".nameany JSONrequiredmodelany JSONrequiredosVersionany JSONrequiredappVersionany JSONrequiredopensSealedboolean
Errors
400Invalid device ID400appId does not match the signed-in app403Notifications belong to people.403Register devices from the mobile app.
curl -X PUT 'https://api.cactive.com.au/v1/me/notifications/devices/{deviceId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"token": "example",
"platform": "ios",
"name": {},
"model": {},
"osVersion": {},
"appVersion": {}
}'Response 200
{
ok: true
}/ v1/ me/ notifications/ devices/ :deviceIdRemoves an app's push registration on this phone (appId, default caity: a withdrawn app may remove its own). Signing the app out removes it too. People only, not assistants.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
deviceIdDevice id: an agent's (
dev_…); under/v1/me/notificationsa phone's install id; under/v1/me/sign-in-approvalsa phone that approves sign-ins (apd_…); under/v1/me/vaultthe id a device made for its vault, and under/v1/me/browser-syncthe id a browser made for sync (22 base64url characters).
Query parameters
appId"home" | "caity" | "tasks" | "brain" | "mail" | "drive" | "photos" | "git" | "cloud" | "maps" | "tenant" | "admin" | "account" | "authenticator" | "mirage" | "health" | "weather" | "marketing" | "crm" | "food" | "vehicles"Default
"caity".
Errors
403Notifications belong to people.403Register devices from the mobile app.
curl -X DELETE 'https://api.cactive.com.au/v1/me/notifications/devices/{deviceId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ notifications/ live-activitiesYour iPhone Live Activity registrations: per phone and app (home; maps and vehicles from the withdrawn apps until they expire), the push-to-start entry (kind: start) and each running flight activity (kind: activity, with orgId, hex, watchId or local), the APNs environment and, on the push-to-start entry, the flight activities the app last reported running (running). No tokens.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Notifications belong to people.
curl 'https://api.cactive.com.au/v1/me/notifications/live-activities' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
liveActivities: {
kind: "start" | "activity"
installId: string
appId: string
activityId: string
environment: "production" | "development"
orgId?: string
hex?: string
watchId?: string
vehicleId?: string
session?: string
local?: boolean
running?: string[]
createdAt?: number
updatedAt?: number
}[]
}/ v1/ me/ notifications/ live-activities/ start/ :installIdRegisters the app's push-to-start token on this iPhone (token in hex, appId home: a withdrawn app gets 410, environment production or development, bundleId, and running: the hexes of the flight activities running in the app, sent again whenever they change), so a flight watch can start a Live Activity at takeoff. From the signed-in iPhone app only; tied to its sign-in.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
installIdThe phone's install id (the same for every app on it).
Request body
tokenstringrequiredappId"home" | "caity" | "tasks" | "brain" | "mail" | "drive" | "photos" | "git" | "cloud" | "maps" | "tenant" | "admin" | "account" | "authenticator" | "mirage" | "health" | "weather" | "marketing" | "crm" | "food" | "vehicles"requiredenvironment"production" | "development"requiredbundleIdstringrequiredrunningstring[]Up to 20 items. Each matches
^~?[0-9a-fA-F]{6}$.carsboolean
Errors
400appId does not match the signed-in app400Invalid install ID403Notifications belong to people.403Register devices from the mobile app.403Register Live Activities from the iPhone app.
curl -X PUT 'https://api.cactive.com.au/v1/me/notifications/live-activities/start/{installId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"token": "example",
"appId": "home",
"environment": "production",
"bundleId": "<bundleId>"
}'Response 200
{
ok: true
}/ v1/ me/ notifications/ live-activities/ start/ :installIdRemoves the app's push-to-start token on this phone (appId). Signing the app out removes it too.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
installIdThe phone's install id (the same for every app on it).
Query parameters
appId"home" | "caity" | "tasks" | "brain" | "mail" | "drive" | "photos" | "git" | "cloud" | "maps" | "tenant" | "admin" | "account" | "authenticator" | "mirage" | "health" | "weather" | "marketing" | "crm" | "food" | "vehicles"required
Errors
400appId does not match the signed-in app400Invalid install ID403Notifications belong to people.403Register devices from the mobile app.403Register Live Activities from the iPhone app.
curl -X DELETE 'https://api.cactive.com.au/v1/me/notifications/live-activities/start/{installId}?appId=home' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ notifications/ live-activities/ :activityIdRegisters a running flight Live Activity's update token (token, appId, environment, bundleId, installId, orgId, hex, and watchId or local: true for one started with Track live). Needs maps:read in the org; from the signed-in iPhone app only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- maps:read
Path parameters
activityIdActivityKit's id for a running Live Activity on the phone.
Errors
400appId does not match the signed-in app400Invalid install ID400Invalid activity ID403Notifications belong to people.403Register devices from the mobile app.403Register Live Activities from the iPhone app.403Vehicles needs a key made by a person.404Vehicles isn't available here.
curl -X PUT 'https://api.cactive.com.au/v1/me/notifications/live-activities/{activityId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
current: boolean
}
| {
ok: true
}/ v1/ me/ notifications/ live-activities/ :activityIdThe activity ended or was dismissed on the phone: no more updates (installId, appId). stopped=1: the person stopped a flight's in the app, so no fresh one takes its place, as one swiped away gets.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
activityIdActivityKit's id for a running Live Activity on the phone.
Query parameters
installIdstringrequiredappId"home" | "caity" | "tasks" | "brain" | "mail" | "drive" | "photos" | "git" | "cloud" | "maps" | "tenant" | "admin" | "account" | "authenticator" | "mirage" | "health" | "weather" | "marketing" | "crm" | "food" | "vehicles"requiredstopped"1"
Errors
400appId does not match the signed-in app400Invalid install ID403Notifications belong to people.403Register devices from the mobile app.403Register Live Activities from the iPhone app.
curl -X DELETE 'https://api.cactive.com.au/v1/me/notifications/live-activities/{activityId}?installId=%3CinstallId%3E&appId=home' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ notifications/ settingsWhat reaches the person where, event by event, with the app each belongs to (the phone groups them by app: Home → Notifications). The same settings as ID → Notifications. textsOff: the event never texts or calls (Maps' events while Admin's "SMS for Maps alerts" is off), so the apps don't offer either.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Notifications belong to people.
curl 'https://api.cactive.com.au/v1/me/notifications/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
events: {
textsOff?: true
urgent?: true
type: "deployment.ready" | "deployment.failed" | "domain.verified" | "domain.failed" | "secret.rotation_due" | "issue.sla_breached" | "pipeline.failed" | "pipeline.approval" | "security.git_key" | "security.git_clone" | "tenant.domain" | "agent.job_failed" | "marketing.approval" | "maps.incident" | "maps.flight" | "assistant.briefing" | "caity.task_done" | "caity.task_failed" | "caity.task_waiting" | "caity.code_waiting" | "caity.code_failed" | "caity.code_done" | "account.new_sign_in" | "account.password_changed" | "sharing.offered" | "sharing.changed" | "sharing.link_stopped" | "tenant.access_request" | "tenant.access_answer" | "sharing.activity" | "issue.assigned" | "issue.mentioned" | "mail.sync_held" | "calendar.invite_unanswered" | "calendar.meeting_soon" | "page.mentioned" | "mail.vip" | "maps.watch" | "maps.findmy" | "maps.eta" | "photos.comment" | "photos.album" | "weather.rain" | "weather.warning" | "maps.findmy_sound" | "office.mention" | "video.captions" | "food.receipt" | "food.use_soon" | "vehicles.car_alert" | "vehicles.automation" | "vehicles.unlocked" | "vehicles.rain" | "vehicles.charge" | "vehicles.plug_in" | "vehicles.battery_low" | "vehicles.sentry" | "vehicles.moved" | "vehicles.drive" | "vehicles.speeding" | "vehicles.harsh" | "vehicles.geofence" | "vehicles.climate_safety" | "vehicles.tyre" | "vehicles.software" | "vehicles.command" | "vehicles.access" | "vehicles.connection" | "vehicles.maintenance" | "agent.job_done" | "security.repo_access" | "tenant.domain_join" | "ops.alarm" | "crm.export_failed" | "marketing.journey" | "vehicles.spend" | "mirage.report" | "feedback.bug"
app: "admin" | "authenticator" | "cloud" | "git" | "tasks" | "crm" | "mail" | "maps" | "drive" | "photos" | "tenant" | "health" | "weather" | "marketing" | "food" | "vehicles" | "caity" | "home" | "mirage" | "account" | "brain"
label: string
description: string
channels: ("email" | "sms" | "push" | "voice" | "inapp")[]
}[]
hasPhone: boolean
callsAvailable: boolean
quietHours: null | {
start: string
end: string
days?: number[]
allowUrgent: boolean
}
timeZone: string
vipSenders: string[]
meetingLeadMinutes: number
calendarReminders: boolean
}/ v1/ me/ notifications/ settings/ prefsQuiet hours, the time zone, important senders and calendar reminders (the events' channels stay as they are); people only, from their own apps. Cleaned as ID cleans them (cleanPrefs).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
quietHoursobjector nullquietHours.startstringrequiredMatches
^([01]\d|2[0-3]):[0-5]\d$.quietHours.endstringrequiredMatches
^([01]\d|2[0-3]):[0-5]\d$.quietHours.allowUrgentbooleanrequiredquietHours.daysinteger[]Up to 7 items. Each 0–6.
timeZonestring1–64 characters.
vipSendersstring[]Up to 100 items. Each up to 254 characters, trimmed.
meetingLeadMinutesinteger0–120.
calendarRemindersboolean
Also checked: Unknown fields are rejected.
Errors
403Notifications belong to people.403Register devices from the mobile app.
curl -X PUT 'https://api.cactive.com.au/v1/me/notifications/settings/prefs' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"quietHours": {
"start": "example",
"end": "example",
"allowUrgent": true
},
"timeZone": "example",
"vipSenders": [
"example"
]
}'Response 200
{
quietHours: null | {
start: string
end: string
days?: number[]
allowUrgent: boolean
}
timeZone: string
vipSenders: string[]
meetingLeadMinutes: number
calendarReminders: boolean
}/ v1/ me/ notifications/ settings/ eventsSome events' channels (the rest stay as they are); people only, from their own apps.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
eventsobjectrequiredKeys up to 64 characters. Values: ("inapp" | "push" | "email" | "sms" | "voice")[] (up to 5 items).
Errors
403Notifications belong to people.403Register devices from the mobile app.
curl -X PUT 'https://api.cactive.com.au/v1/me/notifications/settings/events' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"events": {}
}'Response 200
{
events: {
[key: string]: ("email" | "sms" | "push" | "voice" | "inapp")[]
}
}/ v1/ me/ notifications/ web-pushWeb push in your browsers: the key browsers subscribe with (publicKey, null where the stage has none) and your subscriptions, one per app per browser (subId, app, label, createdAt, lastUsedAt). No endpoints or keys.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Errors
403Notifications belong to people.
curl 'https://api.cactive.com.au/v1/me/notifications/web-push' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
publicKey: null | string
subscriptions: {
subId: string
app: string
label?: string
createdAt?: number
lastUsedAt?: number
}[]
}/ v1/ me/ notifications/ web-pushTurns on web push for one app in this browser (the header's bell): the browser's endpoint and keys (p256dh, auth), the web app, the browser's id (browserId, so a notice shows once per browser) and a label. Endpoints must be a browser push service's. A browser signed in as someone else moves to you. Answers the subId. People only, not assistants; 503 where the stage has no web push key.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
endpointstringrequiredUp to 1,000 characters.
keysobjectrequiredkeys.p256dhstringrequiredUp to 200 characters.
keys.authstringrequiredUp to 100 characters.
appstringrequiredUp to 32 characters.
browserIdstringUp to 64 characters.
labelstringUp to 200 characters.
Errors
403Notifications belong to people.403Register devices from the mobile app.
curl -X POST 'https://api.cactive.com.au/v1/me/notifications/web-push' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"endpoint": "https://example.com",
"keys": {
"p256dh": "example",
"auth": "example"
},
"app": "example"
}'Response 200
{
subId: string
}/ v1/ me/ notifications/ web-push/ :subIdTurns off one of your web push subscriptions (the SHA-256 of its endpoint, base64url). Signing out of the app does it too.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
subIdWeb push subscription id, as listed by
GET /v1/orgs/:orgId/maps/pushorGET /v1/me/notifications/web-push.
Errors
400Invalid subscription id403Notifications belong to people.
curl -X DELETE 'https://api.cactive.com.au/v1/me/notifications/web-push/{subId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ me/ notificationsYour notifications, newest first (cursor, limit): title, body, link, read, and whether one waits for an acknowledgement (escalating alerts). app: only that mobile app's notices (home: every app's). People only.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Query parameters
cursorstringUp to 2,000 characters.
limitinteger1–100. Coerced from a string.
app"home" | "caity" | "tasks" | "brain" | "mail" | "drive" | "photos" | "git" | "cloud" | "maps" | "tenant" | "admin" | "account" | "authenticator" | "mirage" | "health" | "weather" | "marketing" | "crm" | "food" | "vehicles"
Errors
403Notifications belong to people.
curl 'https://api.cactive.com.au/v1/me/notifications' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
notices: {
noticeId: string
orgId?: string
event: string
title: string
body?: string
url?: string
read?: boolean
requireAck?: boolean
ackedAt?: number
createdAt?: number
}[]
cursor: null | string
}/ v1/ me/ notifications/ readMarks notifications read (noticeIds, up to 100).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Request body
noticeIdsstring[]required1–100 items. Each up to 64 characters.
Errors
403Notifications belong to people.
curl -X POST 'https://api.cactive.com.au/v1/me/notifications/read' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"noticeIds": [
"example"
]
}'Response 200
{
ok: true
}/ v1/ me/ notifications/ :noticeId/ ackAcknowledges a notification: its escalation (later texts or calls) stops. acked: false when it already was.
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
noticeIdNotification id (
nte_…).
Errors
403Notifications belong to people.
curl -X POST 'https://api.cactive.com.au/v1/me/notifications/{noticeId}/ack' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
acked: boolean
}/ v1/ orgs/ :orgId/ notify/ protocols/ templatesReady-made notification protocols (production on-call, meeting guard, invitation chaser, VIP mail, service desk SLA, agent jobs).
- Auth
- A person's token or an API key, as Authorization: Bearer.
Path parameters
orgIdOrganization id (
org_…).
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/notify/protocols/templates' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
templates: {
id: string
name: string
description: string
rules: {
events: ("deployment.ready" | "deployment.failed" | "domain.verified" | "domain.failed" | "secret.rotation_due" | "issue.sla_breached" | "pipeline.failed" | "pipeline.approval" | "security.git_key" | "security.git_clone" | "tenant.domain" | "agent.job_failed" | "marketing.approval" | "maps.incident" | "maps.flight" | "assistant.briefing" | "caity.task_done" | "caity.task_failed" | "caity.task_waiting" | "caity.code_waiting" | "caity.code_failed" | "caity.code_done" | "account.new_sign_in" | "account.password_changed" | "sharing.offered" | "sharing.changed" | "sharing.link_stopped" | "tenant.access_request" | "tenant.access_answer" | "sharing.activity" | "issue.assigned" | "issue.mentioned" | "mail.sync_held" | "calendar.invite_unanswered" | "calendar.meeting_soon" | "page.mentioned" | "mail.vip" | "maps.watch" | "maps.findmy" | "maps.eta" | "photos.comment" | "photos.album" | "weather.rain" | "weather.warning" | "maps.findmy_sound" | "office.mention" | "video.captions" | "food.receipt" | "food.use_soon" | "vehicles.car_alert" | "vehicles.automation" | "vehicles.unlocked" | "vehicles.rain" | "vehicles.charge" | "vehicles.plug_in" | "vehicles.battery_low" | "vehicles.sentry" | "vehicles.moved" | "vehicles.drive" | "vehicles.speeding" | "vehicles.harsh" | "vehicles.geofence" | "vehicles.climate_safety" | "vehicles.tyre" | "vehicles.software" | "vehicles.command" | "vehicles.access" | "vehicles.connection" | "vehicles.maintenance" | "agent.job_done" | "security.repo_access" | "tenant.domain_join" | "ops.alarm" | "crm.export_failed" | "marketing.journey" | "vehicles.spend" | "mirage.report" | "feedback.bug")[]
match?: {
[key: string]: string[]
}
steps: {
afterMinutes: number
channels: object
}[]
beforeEvent?: boolean
roles?: ("owner" | "admin" | "developer" | "viewer")[]
userIds?: string[]
overrideQuietHours?: boolean
}[]
}[]
}/ v1/ orgs/ :orgId/ notify/ protocolsThe organization's notification protocols with their rules and what each is attached to.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- org:read
Path parameters
orgIdOrganization id (
org_…).
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/notify/protocols' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
protocols: {
protocolId: string
orgId: string
name: string
description?: string
enabled: boolean
rules: {
events: ("deployment.ready" | "deployment.failed" | "domain.verified" | "domain.failed" | "secret.rotation_due" | "issue.sla_breached" | "pipeline.failed" | "pipeline.approval" | "security.git_key" | "security.git_clone" | "tenant.domain" | "agent.job_failed" | "marketing.approval" | "maps.incident" | "maps.flight" | "assistant.briefing" | "caity.task_done" | "caity.task_failed" | "caity.task_waiting" | "caity.code_waiting" | "caity.code_failed" | "caity.code_done" | "account.new_sign_in" | "account.password_changed" | "sharing.offered" | "sharing.changed" | "sharing.link_stopped" | "tenant.access_request" | "tenant.access_answer" | "sharing.activity" | "issue.assigned" | "issue.mentioned" | "mail.sync_held" | "calendar.invite_unanswered" | "calendar.meeting_soon" | "page.mentioned" | "mail.vip" | "maps.watch" | "maps.findmy" | "maps.eta" | "photos.comment" | "photos.album" | "weather.rain" | "weather.warning" | "maps.findmy_sound" | "office.mention" | "video.captions" | "food.receipt" | "food.use_soon" | "vehicles.car_alert" | "vehicles.automation" | "vehicles.unlocked" | "vehicles.rain" | "vehicles.charge" | "vehicles.plug_in" | "vehicles.battery_low" | "vehicles.sentry" | "vehicles.moved" | "vehicles.drive" | "vehicles.speeding" | "vehicles.harsh" | "vehicles.geofence" | "vehicles.climate_safety" | "vehicles.tyre" | "vehicles.software" | "vehicles.command" | "vehicles.access" | "vehicles.connection" | "vehicles.maintenance" | "agent.job_done" | "security.repo_access" | "tenant.domain_join" | "ops.alarm" | "crm.export_failed" | "marketing.journey" | "vehicles.spend" | "mirage.report" | "feedback.bug")[]
match?: {
[key: string]: string[]
}
steps: {
afterMinutes: number
channels: object
}[]
beforeEvent?: boolean
roles?: ("owner" | "admin" | "developer" | "viewer")[]
userIds?: string[]
overrideQuietHours?: boolean
}[]
createdBy: string
updatedAt?: number
attachments: {
resourceType: "org" | "project" | "agent" | "calendar" | "space" | "mailbox" | "vehicle"
resourceId: string
resourceLabel?: string
}[]
}[]
}/ v1/ orgs/ :orgId/ notify/ protocolsCreates a protocol from { template } or { name, description?, enabled?, rules } (rules: events, optional match on event attributes, steps with minutes and channels, roles, overrideQuietHours, beforeEvent). Owners and admins.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- org:write
Path parameters
orgIdOrganization id (
org_…).
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/notify/protocols' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 201
{
protocol: {
attachments: []
protocolId: string
orgId: string
name: string
description?: string
enabled: boolean
rules: {
events: ("deployment.ready" | "deployment.failed" | "domain.verified" | "domain.failed" | "secret.rotation_due" | "issue.sla_breached" | "pipeline.failed" | "pipeline.approval" | "security.git_key" | "security.git_clone" | "tenant.domain" | "agent.job_failed" | "marketing.approval" | "maps.incident" | "maps.flight" | "assistant.briefing" | "caity.task_done" | "caity.task_failed" | "caity.task_waiting" | "caity.code_waiting" | "caity.code_failed" | "caity.code_done" | "account.new_sign_in" | "account.password_changed" | "sharing.offered" | "sharing.changed" | "sharing.link_stopped" | "tenant.access_request" | "tenant.access_answer" | "sharing.activity" | "issue.assigned" | "issue.mentioned" | "mail.sync_held" | "calendar.invite_unanswered" | "calendar.meeting_soon" | "page.mentioned" | "mail.vip" | "maps.watch" | "maps.findmy" | "maps.eta" | "photos.comment" | "photos.album" | "weather.rain" | "weather.warning" | "maps.findmy_sound" | "office.mention" | "video.captions" | "food.receipt" | "food.use_soon" | "vehicles.car_alert" | "vehicles.automation" | "vehicles.unlocked" | "vehicles.rain" | "vehicles.charge" | "vehicles.plug_in" | "vehicles.battery_low" | "vehicles.sentry" | "vehicles.moved" | "vehicles.drive" | "vehicles.speeding" | "vehicles.harsh" | "vehicles.geofence" | "vehicles.climate_safety" | "vehicles.tyre" | "vehicles.software" | "vehicles.command" | "vehicles.access" | "vehicles.connection" | "vehicles.maintenance" | "agent.job_done" | "security.repo_access" | "tenant.domain_join" | "ops.alarm" | "crm.export_failed" | "marketing.journey" | "vehicles.spend" | "mirage.report" | "feedback.bug")[]
match?: {
[key: string]: string[]
}
steps: {
afterMinutes: number
channels: ("email" | "sms" | "push" | "voice" | "inapp")[]
}[]
beforeEvent?: boolean
roles?: ("owner" | "admin" | "developer" | "viewer")[]
userIds?: string[]
overrideQuietHours?: boolean
}[]
createdBy: string
updatedAt?: number
}
}/ v1/ orgs/ :orgId/ notify/ protocols/ :protocolIdOne protocol with its attachments.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- org:read
Path parameters
orgIdOrganization id (
org_…).protocolIdNotification protocol id (
npr_…).
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/notify/protocols/{protocolId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
protocol: {
protocolId: string
orgId: string
name: string
description?: string
enabled: boolean
rules: {
events: ("deployment.ready" | "deployment.failed" | "domain.verified" | "domain.failed" | "secret.rotation_due" | "issue.sla_breached" | "pipeline.failed" | "pipeline.approval" | "security.git_key" | "security.git_clone" | "tenant.domain" | "agent.job_failed" | "marketing.approval" | "maps.incident" | "maps.flight" | "assistant.briefing" | "caity.task_done" | "caity.task_failed" | "caity.task_waiting" | "caity.code_waiting" | "caity.code_failed" | "caity.code_done" | "account.new_sign_in" | "account.password_changed" | "sharing.offered" | "sharing.changed" | "sharing.link_stopped" | "tenant.access_request" | "tenant.access_answer" | "sharing.activity" | "issue.assigned" | "issue.mentioned" | "mail.sync_held" | "calendar.invite_unanswered" | "calendar.meeting_soon" | "page.mentioned" | "mail.vip" | "maps.watch" | "maps.findmy" | "maps.eta" | "photos.comment" | "photos.album" | "weather.rain" | "weather.warning" | "maps.findmy_sound" | "office.mention" | "video.captions" | "food.receipt" | "food.use_soon" | "vehicles.car_alert" | "vehicles.automation" | "vehicles.unlocked" | "vehicles.rain" | "vehicles.charge" | "vehicles.plug_in" | "vehicles.battery_low" | "vehicles.sentry" | "vehicles.moved" | "vehicles.drive" | "vehicles.speeding" | "vehicles.harsh" | "vehicles.geofence" | "vehicles.climate_safety" | "vehicles.tyre" | "vehicles.software" | "vehicles.command" | "vehicles.access" | "vehicles.connection" | "vehicles.maintenance" | "agent.job_done" | "security.repo_access" | "tenant.domain_join" | "ops.alarm" | "crm.export_failed" | "marketing.journey" | "vehicles.spend" | "mirage.report" | "feedback.bug")[]
match?: {
[key: string]: string[]
}
steps: {
afterMinutes: number
channels: ("email" | "sms" | "push" | "voice" | "inapp")[]
}[]
beforeEvent?: boolean
roles?: ("owner" | "admin" | "developer" | "viewer")[]
userIds?: string[]
overrideQuietHours?: boolean
}[]
createdBy: string
updatedAt?: number
attachments: {
resourceType: "org" | "project" | "agent" | "calendar" | "space" | "mailbox" | "vehicle"
resourceId: string
resourceLabel?: string
}[]
}
}/ v1/ orgs/ :orgId/ notify/ protocols/ :protocolIdReplaces a protocol's name, description, on/off and rules. Owners and admins.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- org:write
Path parameters
orgIdOrganization id (
org_…).protocolIdNotification protocol id (
npr_…).
Request body
namestringrequired1–80 characters. Trimmed.
descriptionstringUp to 300 characters.
enabledbooleanrulesobject[]required1–20 items.
rules[].events[]requiredAt least 1 item.
rules[].matchobjectValues: string[] (up to 20 items, each up to 200 characters).
rules[].stepsobject[]required1–6 items.
rules[].steps[].afterMinutesintegerrequired0–10080.
rules[].steps[].channels("inapp" | "push" | "email" | "sms" | "voice")[]requiredAt least 1 item.
rules[].beforeEventbooleanrules[].roles("owner" | "admin" | "developer" | "viewer")[]rules[].userIdsstring[]Up to 50 items. Each up to 64 characters.
rules[].overrideQuietHoursboolean
curl -X PUT 'https://api.cactive.com.au/v1/orgs/{orgId}/notify/protocols/{protocolId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"rules": [
{
"events": [],
"steps": [
{
"afterMinutes": 1,
"channels": [
"inapp"
]
}
]
}
]
}'Response 200
{
protocol: {
protocolId: string
orgId: string
name: string
description?: string
enabled: boolean
rules: {
events: ("deployment.ready" | "deployment.failed" | "domain.verified" | "domain.failed" | "secret.rotation_due" | "issue.sla_breached" | "pipeline.failed" | "pipeline.approval" | "security.git_key" | "security.git_clone" | "tenant.domain" | "agent.job_failed" | "marketing.approval" | "maps.incident" | "maps.flight" | "assistant.briefing" | "caity.task_done" | "caity.task_failed" | "caity.task_waiting" | "caity.code_waiting" | "caity.code_failed" | "caity.code_done" | "account.new_sign_in" | "account.password_changed" | "sharing.offered" | "sharing.changed" | "sharing.link_stopped" | "tenant.access_request" | "tenant.access_answer" | "sharing.activity" | "issue.assigned" | "issue.mentioned" | "mail.sync_held" | "calendar.invite_unanswered" | "calendar.meeting_soon" | "page.mentioned" | "mail.vip" | "maps.watch" | "maps.findmy" | "maps.eta" | "photos.comment" | "photos.album" | "weather.rain" | "weather.warning" | "maps.findmy_sound" | "office.mention" | "video.captions" | "food.receipt" | "food.use_soon" | "vehicles.car_alert" | "vehicles.automation" | "vehicles.unlocked" | "vehicles.rain" | "vehicles.charge" | "vehicles.plug_in" | "vehicles.battery_low" | "vehicles.sentry" | "vehicles.moved" | "vehicles.drive" | "vehicles.speeding" | "vehicles.harsh" | "vehicles.geofence" | "vehicles.climate_safety" | "vehicles.tyre" | "vehicles.software" | "vehicles.command" | "vehicles.access" | "vehicles.connection" | "vehicles.maintenance" | "agent.job_done" | "security.repo_access" | "tenant.domain_join" | "ops.alarm" | "crm.export_failed" | "marketing.journey" | "vehicles.spend" | "mirage.report" | "feedback.bug")[]
match?: {
[key: string]: string[]
}
steps: {
afterMinutes: number
channels: ("email" | "sms" | "push" | "voice" | "inapp")[]
}[]
beforeEvent?: boolean
roles?: ("owner" | "admin" | "developer" | "viewer")[]
userIds?: string[]
overrideQuietHours?: boolean
}[]
createdBy: string
updatedAt?: number
attachments: {
resourceType: "org" | "project" | "agent" | "calendar" | "space" | "mailbox" | "vehicle"
resourceId: string
resourceLabel?: string
}[]
}
}/ v1/ orgs/ :orgId/ notify/ protocols/ :protocolIdDeletes a protocol and its attachments. Owners and admins.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- org:write
Path parameters
orgIdOrganization id (
org_…).protocolIdNotification protocol id (
npr_…).
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/notify/protocols/{protocolId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ orgs/ :orgId/ notify/ protocols/ :protocolId/ attachmentsAttaches the protocol to { type, id, label? }: the whole organization (org) or a Serverless App Service, Issues space, calendar, mailbox or agent. Events about it then follow the protocol. Owners and admins.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- org:write
Path parameters
orgIdOrganization id (
org_…).protocolIdNotification protocol id (
npr_…).
Request body
type"org" | "project" | "space" | "calendar" | "mailbox" | "agent" | "vehicle"requiredidstringrequired1–128 characters.
labelstringUp to 120 characters.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/notify/protocols/{protocolId}/attachments' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"type": "org",
"id": "<id>"
}'Response 201
{
ok: true
}/ v1/ orgs/ :orgId/ notify/ protocols/ :protocolId/ attachments/ :resourceType/ :targetIdDetaches the protocol from that resource. Owners and admins.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- org:write
Path parameters
orgIdOrganization id (
org_…).protocolIdNotification protocol id (
npr_…).resourceTypeWhat the protocol is attached to:
org,project,space,calendar,mailboxoragent; for a group's access,projectorrepository.targetIdId of what it's attached to (the org's own id for
org, elseprj_…,spc_…,cal_…,mbx_…,dev_…).
Errors
400Unknown resource type.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/notify/protocols/{protocolId}/attachments/{resourceType}/{targetId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body