API reference
Marketing
/ v1/ hooks/ marketing/ c/ :tokenA tracked link: 302 to the send's link at that position (HEAD and scanners count as machine clicks).
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
curl 'https://api.cactive.com.au/v1/hooks/marketing/c/{token}'/ v1/ hooks/ marketing/ o/ :tokenThe open pixel: always the image; bad or test tokens record nothing.
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
curl 'https://api.cactive.com.au/v1/hooks/marketing/o/{token}'Response 200 with no body
/ v1/ hooks/ marketing/ u/ :tokenRFC 8058 one-click unsubscribe from everything (mail clients POST List-Unsubscribe=One-Click).
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
Errors
404This link isn't valid any more.
curl -X POST 'https://api.cactive.com.au/v1/hooks/marketing/u/{token}'Response 200
{
ok: true
}/ v1/ hooks/ marketing/ u/ :tokenThe footer's Unsubscribe link: the preference centre, ready to unsubscribe (a GET never changes anything).
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
curl 'https://api.cactive.com.au/v1/hooks/marketing/u/{token}'/ v1/ hooks/ marketing/ preferences/ :tokenThe preference centre's address (masked), status and topics.
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
Errors
404This link isn't valid any more.
curl 'https://api.cactive.com.au/v1/hooks/marketing/preferences/{token}'Response 200
{
page: {
senderName: string
address: string
status: "none" | "pending" | "unsubscribed" | "subscribed" | "bounced" | "complained"
topics: {
id: string
name: string
description?: string
subscribed: boolean
}[]
}
brand: {
logo?: {
url: string
darkUrl?: string
width: number
alt: string
href?: string
}
colors: {
page: string
card: string
text: string
muted: string
link: string
button: string
buttonText: string
border: string
}
dark?: {
page?: string
card?: string
text?: string
muted?: string
link?: string
button?: string
buttonText?: string
border?: string
}
font: "system" | "serif" | "rounded" | "mono"
radius: number
version: number
updatedAt?: number
}
}/ v1/ hooks/ marketing/ preferences/ :tokenSaves the preference centre: a choice per topic, or unsubscribe from everything.
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
Request body
topicsobjectKeys up to 40 characters. Values: boolean.
unsubscribeAllboolean
Errors
404This link isn't valid any more.
curl -X POST 'https://api.cactive.com.au/v1/hooks/marketing/preferences/{token}' \
-H 'Content-Type: application/json' \
-d '{
"topics": {},
"unsubscribeAll": true
}'Response 200
{
page: {
senderName: string
address: string
status: "none" | "pending" | "unsubscribed" | "subscribed" | "bounced" | "complained"
topics: {
id: string
name: string
description?: string
subscribed: boolean
}[]
}
}/ v1/ hooks/ marketing/ confirm/ :tokenDouble opt-in: the confirmation page's Confirm button (a POST, so mail scanners can't confirm).
- Auth
- None.
Path parameters
tokenA secret from a link: an issue automation rule's incoming-webhook token (shown once when issued), a map's share link, a notification recipient's confirm and unsubscribe link, a Drive public link (
/l/<token>), a Vehicles drive's share link, or a Mirage interaction's token (itk_…, sent with the interaction, good for 15 minutes), or the token in the link to a file of a message Mirage sent to Discord, or a Marketing link's sealed token (a tracked click, the open pixel, unsubscribe and the preference centre, a double opt-in confirmation); or a Food recipe's public link (/r/<token>) or a household's calendar feed.
Errors
404This link has expired or isn't valid. Sign up again to get a new one.
curl -X POST 'https://api.cactive.com.au/v1/hooks/marketing/confirm/{token}'Response 200
{
senderName: string
status: "pending" | "unsubscribed" | "subscribed" | "bounced" | "complained"
topics: string[]
}/ v1/ hooks/ marketing/ forms/ :formIdA form as its page shows it, with a fresh ticket to send back.
- Auth
- None.
Path parameters
formIdA Marketing form's id (
mkf_…).
Errors
404This form isn't taking submissions.
curl 'https://api.cactive.com.au/v1/hooks/marketing/forms/{formId}'Response 200
{
form: {
id: string
name: string
fields: {
param?: string
type: "text" | "email" | "hidden" | "phone" | "textarea" | "select" | "checkbox"
label: string
required?: boolean
id: string
options?: string[]
placeholder?: string
}[]
consent?: {
text: string
required: boolean
}
submitLabel: string
ticket: string
honeypot: string
brand: {
logo?: {
url: string
darkUrl?: string
width: number
alt: string
href?: string
}
colors: {
page: string
card: string
text: string
muted: string
link: string
button: string
buttonText: string
border: string
}
dark?: {
page?: string
card?: string
text?: string
muted?: string
link?: string
button?: string
buttonText?: string
border?: string
}
font: "system" | "serif" | "rounded" | "mono"
radius: number
version: number
updatedAt?: number
}
}
}/ v1/ hooks/ marketing/ forms/ :formIdA submission (values by field, the consent box, the ticket, the page and its query parameters).
- Auth
- None.
Path parameters
formIdA Marketing form's id (
mkf_…).
Request body (up to 63 KB)
valuesobjectrequiredKeys up to 60 characters. Values: any JSON.
consentbooleanticketstringUp to 1,000 characters.
pagestringUp to 2,000 characters.
queryobjectKeys up to 60 characters. Values: string (up to 500 characters).
Errors
413Too much in one submission.
curl -X POST 'https://api.cactive.com.au/v1/hooks/marketing/forms/{formId}' \
-H 'Content-Type: application/json' \
-d '{
"values": {}
}'Response 200
{
ok: true
message: string
redirectUrl?: string
confirmation?: "sent" | "limited" | "unavailable" | "notNeeded"
}/ v1/ hooks/ marketing/ pages/ :org/ :slugA published landing page with its forms; view=1 counts a view.
- Auth
- None.
Path parameters
orgOrganization slug, as in the help center link; under
marketingthe slug a landing page lives under.slugA landing page's slug in its org (lower-case letters, digits and dashes).
Query parameters
view"0" | "1"
Errors
404Page not found
curl 'https://api.cactive.com.au/v1/hooks/marketing/pages/{org}/{slug}'Response 200
{
page: {
pageId: string
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object[], object[]]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
brand: {
logo?: {
url: string
darkUrl?: string
width: number
alt: string
href?: string
}
colors: {
page: string
card: string
text: string
muted: string
link: string
button: string
buttonText: string
border: string
}
dark?: {
page?: string
card?: string
text?: string
muted?: string
link?: string
button?: string
buttonText?: string
border?: string
}
font: "system" | "serif" | "rounded" | "mono"
radius: number
version: number
updatedAt?: number
}
sender: {
name: string
physicalAddress: string
}
forms: {
[key: string]: {
id: string
name: string
fields: {
param?: string
type: "text" | "email" | "hidden" | "phone" | "textarea" | "select" | "checkbox"
label: string
required?: boolean
id: string
options?: string[]
placeholder?: string
}[]
consent?: {
text: string
required: boolean
}
submitLabel: string
ticket: string
honeypot: string
brand: {
logo?: {
url: string
darkUrl?: string
width: number
alt: string
href?: string
}
colors: {
page: string
card: string
text: string
muted: string
link: string
button: string
buttonText: string
border: string
}
dark?: {
page?: string
card?: string
text?: string
muted?: string
link?: string
button?: string
buttonText?: string
border?: string
}
font: "system" | "serif" | "rounded" | "mono"
radius: number
version: number
updatedAt?: number
}
}
}
}
}/ v1/ orgs/ :orgId/ marketing/ metaWhat the app loads first: settings, brand kit, sending state and readiness, Mail domains, approvers, members, limits and what the caller may do.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/meta' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
settings: {
sender: {
name: string
localPart: string
domain?: string
replyTo?: string
}
physicalAddress: string
topics: {
id: string
name: string
description?: string
basis: "optIn" | "optOut"
archived?: boolean
}[]
approvals: {
required: boolean
approvers: string[]
needed: "all" | "one"
expiryDays: number
}
frequencyCap: null | {
messages: number
days: number
}
sendTime: {
defaultHour: number
timeZone: string
}
utm: {
enabled: boolean
source: string
medium: string
}
doubleOptIn: boolean
version: number
updatedAt?: number
}
brand: {
logo?: {
url: string
darkUrl?: string
width: number
alt: string
href?: string
}
colors: {
page: string
card: string
text: string
muted: string
link: string
button: string
buttonText: string
border: string
}
dark?: {
page?: string
card?: string
text?: string
muted?: string
link?: string
button?: string
buttonText?: string
border?: string
}
font: "system" | "serif" | "rounded" | "mono"
radius: number
version: number
updatedAt?: number
}
state: {
paused: null | {
at: number
reason: string
bounceRate: number
complaintRate: number
sends: number
}
warmupStartedAt: null | number
}
readiness: {
ready: boolean
missing: string[]
}
domains: {
domain: string
status: "error" | "active" | "pending" | "verifying"
}[]
approvers: {
userId: string
name?: string
email?: string
role: "owner" | "admin" | "developer" | "viewer"
}[]
people: {
userId: string
name: string
email?: string
role: "owner" | "admin" | "developer" | "viewer"
}[]
permissions: {
write: boolean
send: boolean
admin: boolean
}
me: null | string
plan: {
contacts: number
sendsPerMonth: number
}
orgSlug: null | string
limits: {
imageMb: number
importMb: number
segmentGroups: number
journeySteps: number
testSendsPerHour: number
}
}/ v1/ orgs/ :orgId/ marketing/ settingsSender, physical address, topics, approvals, frequency cap, send-time default, UTM and double opt-in (Marketing admins), over version.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body
senderobjectrequiredsender.namestringrequiredUp to 100 characters.
sender.localPartstringrequiredUp to 64 characters.
sender.domainstringUp to 253 characters.
sender.replyTostringUp to 254 characters.
physicalAddressstringrequiredUp to 500 characters.
topicsobject[]requiredUp to 50 items.
topics[].idstringrequiredUp to 40 characters.
topics[].namestringrequiredUp to 80 characters.
topics[].descriptionstringUp to 300 characters.
topics[].basis"optIn" | "optOut"requiredtopics[].archivedbooleanapprovalsobjectrequiredapprovals.requiredbooleanrequiredapprovals.approversstring[]requiredUp to 50 items. Each up to 64 characters.
approvals.needed"one" | "all"requiredapprovals.expiryDaysintegerrequired1–90.
frequencyCapobjectrequiredor nullfrequencyCap.messagesintegerrequired1–100.
frequencyCap.daysintegerrequired1–90.
sendTimeobjectrequiredsendTime.defaultHourintegerrequired0–23.
sendTime.timeZonestringrequiredUp to 64 characters.
utmobjectrequiredutm.enabledbooleanrequiredutm.sourcestringrequiredUp to 100 characters.
utm.mediumstringrequiredUp to 100 characters.
doubleOptInbooleanrequiredversionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X PUT 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/settings' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"sender": {
"name": "Example",
"localPart": "example"
},
"physicalAddress": "example",
"topics": [
{
"id": "<id>",
"name": "Example",
"basis": "optIn"
}
],
"approvals": {
"required": true,
"approvers": [
"example"
],
"needed": "one",
"expiryDays": 1
},
"frequencyCap": {
"messages": 1,
"days": 1
},
"sendTime": {
"defaultHour": 1,
"timeZone": "example"
},
"utm": {
"enabled": true,
"source": "example",
"medium": "example"
},
"doubleOptIn": true,
"version": 1
}'Response 200
{
settings: {
version: number
sender: {
name: string
localPart: string
domain?: string
replyTo?: string
}
physicalAddress: string
topics: {
id: string
name: string
description?: string
basis: "optIn" | "optOut"
archived?: boolean
}[]
approvals: {
required: boolean
approvers: string[]
needed: "all" | "one"
expiryDays: number
}
frequencyCap: null | {
messages: number
days: number
}
sendTime: {
defaultHour: number
timeZone: string
}
utm: {
enabled: boolean
source: string
medium: string
}
doubleOptIn: boolean
updatedAt?: number
}
}/ v1/ orgs/ :orgId/ marketing/ brandThe brand kit marketing email is drawn in: logo, light and dark colours, font and corner radius (Marketing admins).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body
logoobjectlogo.urlstringrequiredUp to 2,000 characters.
logo.darkUrlstringUp to 2,000 characters.
logo.widthintegerrequiredlogo.altstringrequiredUp to 300 characters.
logo.hrefstringUp to 2,000 characters.
colorsobjectrequiredcolors.pagestringrequiredUp to 32 characters.
colors.cardstringrequiredUp to 32 characters.
colors.textstringrequiredUp to 32 characters.
colors.mutedstringrequiredUp to 32 characters.
colors.linkstringrequiredUp to 32 characters.
colors.buttonstringrequiredUp to 32 characters.
colors.buttonTextstringrequiredUp to 32 characters.
colors.borderstringrequiredUp to 32 characters.
darkobjectdark.pagestringUp to 32 characters.
dark.cardstringUp to 32 characters.
dark.textstringUp to 32 characters.
dark.mutedstringUp to 32 characters.
dark.linkstringUp to 32 characters.
dark.buttonstringUp to 32 characters.
dark.buttonTextstringUp to 32 characters.
dark.borderstringUp to 32 characters.
font"system" | "serif" | "rounded" | "mono"requiredradiusintegerrequired0–32.
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X PUT 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/brand' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"colors": {
"page": "example",
"card": "example",
"text": "example",
"muted": "example",
"link": "example",
"button": "example",
"buttonText": "example",
"border": "example"
},
"font": "system",
"radius": 1,
"version": 1
}'Response 200
{
brand: {
version: number
logo?: {
url: string
darkUrl?: string
width: number
alt: string
href?: string
}
colors: {
page: string
card: string
text: string
muted: string
link: string
button: string
buttonText: string
border: string
}
dark?: {
page?: string
card?: string
text?: string
muted?: string
link?: string
button?: string
buttonText?: string
border?: string
}
font: "system" | "serif" | "rounded" | "mono"
radius: number
updatedAt?: number
}
}/ v1/ orgs/ :orgId/ marketing/ resumeLifts the reputation guard's pause once the audience is cleaned (Marketing admins).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/resume' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
resumedAt: number
}/ v1/ orgs/ :orgId/ marketing/ usageMessages this month and today (the plan's month, warm-up's day) and the plan's limits.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/usage' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
usage: {
month: number
day: number
}
plan: {
contacts: number
sendsPerMonth: number
}
}/ v1/ orgs/ :orgId/ marketing/ stats/ dailyThe org's numbers per UTC day (from, to as YYYYMMDD; the last 30 days by default) and their totals.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Query parameters
fromstringUp to 8 characters.
tostringUp to 8 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/stats/daily' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
from: string
to: string
days: {
entries: number
queued: number
skipped: number
failed: number
rejected: number
unsubscribed: number
opened: number
bounced: number
complained: number
sent: number
delivered: number
softBounced: number
opens: number
machineOpens: number
clicked: number
clicks: number
machineClicks: number
conversions: number
revenue: number
spam: number
texts: number
submissions: number
pageViews: number
day: string
}[]
totals: {
entries: number
queued: number
skipped: number
failed: number
rejected: number
unsubscribed: number
opened: number
bounced: number
complained: number
sent: number
delivered: number
softBounced: number
opens: number
machineOpens: number
clicked: number
clicks: number
machineClicks: number
conversions: number
revenue: number
spam: number
texts: number
submissions: number
pageViews: number
}
}/ v1/ orgs/ :orgId/ marketing/ people/ :addressAn address's consent, its history (newest first), its engagement summary and recent opens, clicks and unsubscribes.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).addressAn email address (URL-encoded): the alias, or the forwarding address; under
marketinga person's email address or mobile number.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/people/{address}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
engagement: {
address: string
lastSentAt?: number
lastOpenAt?: number
lastClickAt?: number
lastTouch?: {
sendId: string
at: number
}
sent: number
opens: number
clicks: number
hours: number[]
}
recent: {
at: number
type: "open" | "unsubscribe" | "click" | "bounce" | "complaint"
sendId: string
machine?: boolean
url?: string
}[]
address: string
consent?: {
address: string
channel: "email" | "sms"
status: "pending" | "unsubscribed" | "subscribed" | "bounced" | "complained"
topics: {
[key: string]: "out" | "in"
}
pendingTopics?: string[]
proof: {
at: number
source: "form" | "app" | "api" | "preferences" | "unsubscribe" | "import" | "bounce" | "complaint" | "doubleOptIn"
ipHash?: string
userAgent?: string
formId?: string
page?: string
wording?: {
version: string
text?: string
}
actor?: string
sendId?: string
note?: string
}
confirmations?: number[]
createdAt: number
updatedAt: number
version: number
}
history: {
at: number
status: "pending" | "unsubscribed" | "subscribed" | "bounced" | "complained"
topics: {
[key: string]: "out" | "in"
}
proof: {
at: number
source: "form" | "app" | "api" | "preferences" | "unsubscribe" | "import" | "bounce" | "complaint" | "doubleOptIn"
ipHash?: string
userAgent?: string
formId?: string
page?: string
wording?: {
version: string
text?: string
}
actor?: string
sendId?: string
note?: string
}
}[]
}/ v1/ orgs/ :orgId/ marketing/ people/ :address/ consentSets an address's consent by hand with a note as the evidence (Marketing admins); subscribing clears a bounce or complaint.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).addressAn email address (URL-encoded): the alias, or the forwarding address; under
marketinga person's email address or mobile number.
Request body
status"subscribed" | "unsubscribed"requiredtopicsobjectKeys up to 40 characters. Values: "in" | "out".
notestringrequiredUp to 500 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X PUT 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/people/{address}/consent' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"status": "subscribed",
"note": "example"
}'Response 200
{
consent: {
address: string
channel: "email" | "sms"
status: "pending" | "unsubscribed" | "subscribed" | "bounced" | "complained"
topics: {
[key: string]: "out" | "in"
}
pendingTopics?: string[]
proof: {
at: number
source: "form" | "app" | "api" | "preferences" | "unsubscribe" | "import" | "bounce" | "complaint" | "doubleOptIn"
ipHash?: string
userAgent?: string
formId?: string
page?: string
wording?: {
version: string
text?: string
}
actor?: string
sendId?: string
note?: string
}
confirmations?: number[]
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ listsStatic and suppression lists with their member counts.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
lists: {
count: number
id: string
name: string
description?: string
kind: "static" | "suppression"
channel: "email" | "sms"
createdBy: string
createdAt: number
updatedAt: number
version: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ listsA static list (people added by hand, CSV or API) or a suppression list (never sent to), for email or texts.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body
namestringrequired1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
kind"static" | "suppression"channel"email" | "sms"
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example"
}'Response 201
{
list: {
id: string
name: string
description?: string
kind: "static" | "suppression"
channel: "email" | "sms"
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ lists/ :listIdOne list.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).listIdSaved map id (
mls_…); undermarketinga list (mkl_…); underme/fooda shopping list (fls_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists/{listId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
list: {
count: number
id: string
name: string
description?: string
kind: "static" | "suppression"
channel: "email" | "sms"
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ lists/ :listIdRenames a list or changes its description, over version.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).listIdSaved map id (
mls_…); undermarketinga list (mkl_…); underme/fooda shopping list (fls_…).
Request body
namestring1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists/{listId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
list: {
updatedAt: number
version: number
description?: string
name: string
id: string
kind: "static" | "suppression"
channel: "email" | "sms"
createdBy: string
createdAt: number
}
}/ v1/ orgs/ :orgId/ marketing/ lists/ :listIdDeletes a list no segment or unsent campaign uses (its members go in the background).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).listIdSaved map id (
mls_…); undermarketinga list (mkl_…); underme/fooda shopping list (fls_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists/{listId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ orgs/ :orgId/ marketing/ lists/ :listId/ membersA page of a list's members.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).listIdSaved map id (
mls_…); undermarketinga list (mkl_…); underme/fooda shopping list (fls_…).
Query parameters
limitintegerDefault
50. 1–200. Coerced from a string.cursorstringUp to 4,000 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists/{listId}/members' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
members: {
address: string
fields: {
[key: string]: string
}
recordId?: string
addedAt: number
source: "app" | "api" | "import" | "journey" | "segment"
}[]
cursor?: string
}/ v1/ orgs/ :orgId/ marketing/ lists/ :listId/ membersAdds people by address (with merge fields for people not in Customers); admins may record the consent they gave elsewhere, with a note.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).listIdSaved map id (
mls_…); undermarketinga list (mkl_…); underme/fooda shopping list (fls_…).
Request body (up to 977 KB)
membersobject[]required1–1,000 items.
members[].addressstringrequiredUp to 254 characters.
members[].fieldsobjectKeys up to 40 characters. Values: string (up to 500 characters).
members[].recordIdstringUp to 40 characters.
consentobjectconsent.topicsstring[]requiredUp to 20 items. Each up to 40 characters.
consent.notestringrequiredUp to 500 characters.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists/{listId}/members' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"members": [
{
"address": "example"
}
]
}'Response 200
{
added: number
existing: number
invalid: number[]
consented: number
}/ v1/ orgs/ :orgId/ marketing/ lists/ :listId/ members/ removeRemoves people from a list by address.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).listIdSaved map id (
mls_…); undermarketinga list (mkl_…); underme/fooda shopping list (fls_…).
Request body
addressesstring[]required1–1,000 items. Each up to 254 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists/{listId}/members/remove' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"addresses": [
"example"
]
}'Response 200
{
removed: number
}/ v1/ orgs/ :orgId/ marketing/ lists/ :listId/ importsStarts a CSV import: small files with the request (content), larger ones to the returned upload URL.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).listIdSaved map id (
mls_…); undermarketinga list (mkl_…); underme/fooda shopping list (fls_…).
Request body (up to 977 KB)
fileNamestringrequired1–200 characters.
sizeintegerrequired≥ 1.
contentstringUp to 900,000 characters.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/lists/{listId}/imports' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"fileName": "Example",
"size": 1
}'Response 201
{
job: {
id: string
kind: "count" | "import" | "build" | "journey" | "rollup"
state: "queued" | "ready" | "done" | "failed" | "running" | "uploading"
progress: {
listId: string
fileName: string
fileKey: string
size: number
headers?: string[]
mapping?: string[]
consent?: {
topics: string[]
note: string
}
rows: number
added: number
existing: number
invalid: number
consented: number
offset: number
errors: {
row: number
message: string
}[]
}
error?: string
createdBy: string
createdAt: number
updatedAt: number
}
uploadUrl?: string
}/ v1/ orgs/ :orgId/ marketing/ imports/ :jobIdA list import's progress: rows read, added, skipped and why.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).jobIdJob id: an agent job (
job_…), underpipelinesa pipeline job (pjb_…), or undercrman import or export (cjb_…); undermarketinga list import (mkj_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/imports/{jobId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
job: {
id: string
kind: "count" | "import" | "build" | "journey" | "rollup"
state: "queued" | "ready" | "done" | "failed" | "running" | "uploading"
progress: {
listId: string
fileName: string
fileKey: string
size: number
headers?: string[]
mapping?: string[]
consent?: {
topics: string[]
note: string
}
rows: number
added: number
existing: number
invalid: number
consented: number
offset: number
errors: {
row: number
message: string
}[]
}
error?: string
createdBy: string
createdAt: number
updatedAt: number
}
}/ v1/ orgs/ :orgId/ marketing/ imports/ :jobId/ previewThe file's columns, a few rows and the suggested mapping.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).jobIdJob id: an agent job (
job_…), underpipelinesa pipeline job (pjb_…), or undercrman import or export (cjb_…); undermarketinga list import (mkj_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/imports/{jobId}/preview' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
job: {
id: string
kind: "count" | "import" | "build" | "journey" | "rollup"
state: "queued" | "ready" | "done" | "failed" | "running" | "uploading"
progress: {
listId: string
fileName: string
fileKey: string
size: number
headers?: string[]
mapping?: string[]
consent?: {
topics: string[]
note: string
}
rows: number
added: number
existing: number
invalid: number
consented: number
offset: number
errors: {
row: number
message: string
}[]
}
error?: string
createdBy: string
createdAt: number
updatedAt: number
}
headers: string[]
sample: string[][]
mapping: string[]
estimatedRows: number
}/ v1/ orgs/ :orgId/ marketing/ imports/ :jobId/ startRuns the import with a mapping (a target per column: email, phone, firstName, … or blank) and, for admins, the consent people gave.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).jobIdJob id: an agent job (
job_…), underpipelinesa pipeline job (pjb_…), or undercrman import or export (cjb_…); undermarketinga list import (mkj_…).
Request body
mappingstring[]requiredUp to 200 items. Each up to 60 characters.
consentobjectconsent.topicsstring[]requiredUp to 20 items. Each up to 40 characters.
consent.notestringrequiredUp to 500 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/imports/{jobId}/start' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"mapping": [
"example"
]
}'Response 200
{
job?: {
id: string
kind: "count" | "import" | "build" | "journey" | "rollup"
state: "queued" | "ready" | "done" | "failed" | "running" | "uploading"
progress: {
listId: string
fileName: string
fileKey: string
size: number
headers?: string[]
mapping?: string[]
consent?: {
topics: string[]
note: string
}
rows: number
added: number
existing: number
invalid: number
consented: number
offset: number
errors: {
row: number
message: string
}[]
}
error?: string
createdBy: string
createdAt: number
updatedAt: number
}
}/ v1/ orgs/ :orgId/ marketing/ segmentsSegments, by name, with their last size estimate.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/segments' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
segments: {
id: string
name: string
description?: string
groups: {
source: {
object?: "contact" | "lead"
listId?: string
}
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
engagement: {
event: "opened" | "sent" | "clicked"
days: number
negate?: boolean
}[]
lists: {
listId: string
member: boolean
}[]
}[]
estimate?: {
count: number
at: number
exact: boolean
}
counting?: {
jobId: string
startedAt: number
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ segmentsA segment: OR-groups of Customers filters (relative dates $daysAgo:N), engagement and list conditions.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body
namestringrequired1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
groupsobject[]required1–50 items.
groups[].sourceobject | objectrequiredgroups[].filtersobject[]Default
[]. Up to 20 items.groups[].filters[].fieldstringrequired1–60 characters.
groups[].filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"requiredgroups[].filters[].valueany JSONgroups[].engagementobject[]Default
[]. Up to 10 items.groups[].engagement[].event"sent" | "opened" | "clicked"requiredgroups[].engagement[].daysintegerrequired1–1100.
groups[].engagement[].negatebooleangroups[].listsobject[]Default
[]. Up to 10 items.groups[].lists[].listIdstringrequiredUp to 60 characters.
groups[].lists[].memberbooleanrequired
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/segments' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"groups": [
{
"source": {}
}
]
}'Response 201
{
segment: {
id: string
name: string
description?: string
groups: {
source: {
object?: "contact" | "lead"
listId?: string
}
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
engagement: {
event: "opened" | "sent" | "clicked"
days: number
negate?: boolean
}[]
lists: {
listId: string
member: boolean
}[]
}[]
estimate?: {
count: number
at: number
exact: boolean
}
counting?: {
jobId: string
startedAt: number
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ segments/ previewThe first people a segment (saved or not) reaches, as the caller sees Customers: the builder's live preview.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body
groupsobject[]required1–50 items.
groups[].sourceobject | objectrequiredgroups[].filtersobject[]Default
[]. Up to 20 items.groups[].filters[].fieldstringrequired1–60 characters.
groups[].filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"requiredgroups[].filters[].valueany JSONgroups[].engagementobject[]Default
[]. Up to 10 items.groups[].engagement[].event"sent" | "opened" | "clicked"requiredgroups[].engagement[].daysintegerrequired1–1100.
groups[].engagement[].negatebooleangroups[].listsobject[]Default
[]. Up to 10 items.groups[].lists[].listIdstringrequiredUp to 60 characters.
groups[].lists[].memberbooleanrequiredlimitinteger1–50.
channel"email" | "sms"
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/segments/preview' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"groups": [
{
"source": {}
}
]
}'Response 200
{
people: {
address: string
name?: string
recordId?: string
object?: string
}[]
more: boolean
}/ v1/ orgs/ :orgId/ marketing/ segments/ :segmentIdOne segment with its groups and estimate.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).segmentIdA Marketing segment's id (
seg_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/segments/{segmentId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
segment: {
id: string
name: string
description?: string
groups: {
source: {
object?: "contact" | "lead"
listId?: string
}
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
engagement: {
event: "opened" | "sent" | "clicked"
days: number
negate?: boolean
}[]
lists: {
listId: string
member: boolean
}[]
}[]
estimate?: {
count: number
at: number
exact: boolean
}
counting?: {
jobId: string
startedAt: number
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ segments/ :segmentIdReplaces a segment's name, description and groups over version (its estimate is cleared).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).segmentIdA Marketing segment's id (
seg_…).
Request body
namestringrequired1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
groupsobject[]required1–50 items.
groups[].sourceobject | objectrequiredgroups[].filtersobject[]Default
[]. Up to 20 items.groups[].filters[].fieldstringrequired1–60 characters.
groups[].filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"requiredgroups[].filters[].valueany JSONgroups[].engagementobject[]Default
[]. Up to 10 items.groups[].engagement[].event"sent" | "opened" | "clicked"requiredgroups[].engagement[].daysintegerrequired1–1100.
groups[].engagement[].negatebooleangroups[].listsobject[]Default
[]. Up to 10 items.groups[].lists[].listIdstringrequiredUp to 60 characters.
groups[].lists[].memberbooleanrequiredversionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X PUT 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/segments/{segmentId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"groups": [
{
"source": {}
}
],
"version": 1
}'Response 200
{
segment: {
id: string
name: string
description?: string
groups: {
source: {
object?: "contact" | "lead"
listId?: string
}
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
engagement: {
event: "opened" | "sent" | "clicked"
days: number
negate?: boolean
}[]
lists: {
listId: string
member: boolean
}[]
}[]
estimate?: {
count: number
at: number
exact: boolean
}
counting?: {
jobId: string
startedAt: number
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ segments/ :segmentIdDeletes a segment no unsent campaign or running journey uses.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).segmentIdA Marketing segment's id (
seg_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/segments/{segmentId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ orgs/ :orgId/ marketing/ segments/ :segmentId/ estimateCounts the segment's people in the background (deduplicated by address); the result lands on the segment.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).segmentIdA Marketing segment's id (
seg_…).
Request body
channel"email" | "sms"
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/segments/{segmentId}/estimate' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"channel": "email"
}'Response 200
{
segment: {
id: string
name: string
description?: string
groups: {
source: {
object?: "contact" | "lead"
listId?: string
}
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
engagement: {
event: "opened" | "sent" | "clicked"
days: number
negate?: boolean
}[]
lists: {
listId: string
member: boolean
}[]
}[]
estimate?: {
count: number
at: number
exact: boolean
}
counting?: {
jobId: string
startedAt: number
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ templatesTemplates campaigns start from.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/templates' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
templates: {
id: string
name: string
description?: string
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
}[]
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ templatesA template: a block document campaigns can start from.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body (up to 977 KB)
namestringrequired1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
documentobjectrequiredValues: any JSON.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/templates' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"document": {}
}'Response 201
{
template: {
id: string
name: string
description?: string
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ templates/ :templateIdOne template with its document.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).templateIdA Marketing template's id (
tpl_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/templates/{templateId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
template: {
id: string
name: string
description?: string
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ templates/ :templateIdChanges a template's name, description or document over version.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).templateIdA Marketing template's id (
tpl_…).
Request body (up to 977 KB)
namestring1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
documentobjectValues: any JSON.
versionintegerrequired≥ 0.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/templates/{templateId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
template: {
id: string
name: string
description?: string
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ templates/ :templateIdDeletes a template (campaigns made from it keep their copy).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).templateIdA Marketing template's id (
tpl_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/templates/{templateId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ orgs/ :orgId/ marketing/ blocksSaved blocks in the content library.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/blocks' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
blocks: {
id: string
name: string
block: {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "divider"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [{
id: string
when?: object
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: object
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "divider"
} | {
id: string
when?: object
type: "spacer"
height: number
} | object | {
id: string
when?: object
type: "social"
links: object
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "footer"
markdown: string
}[], {
id: string
when?: object
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: object
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "divider"
} | {
id: string
when?: object
type: "spacer"
height: number
} | object | {
id: string
when?: object
type: "social"
links: object
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "footer"
markdown: string
}[]]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "footer"
markdown: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ blocksSaves a block (with its columns, if any) to the content library.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body (up to 977 KB)
namestringrequired1–120 characters. Trimmed.
blockobjectrequiredValues: any JSON.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/blocks' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"block": {}
}'Response 201
{
block: {
id: string
name: string
block: {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "divider"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [{
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | object | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
}[], {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | object | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
}[]]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
type: "footer"
markdown: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ blocks/ :blockIdDeletes a saved block.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).blockIdA saved block's id in the Marketing content library (
mkb_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/blocks/{blockId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ orgs/ :orgId/ marketing/ imagesImages on the content library's CDN host.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/images' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
images: {
id: string
name: string
key: string
url: string
contentType: string
bytes: number
status: "ready" | "uploading"
createdBy: string
createdAt: number
version: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ imagesAn image upload: the URL the browser PUTs the file to; then finish. PNG, JPEG, GIF or WebP.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body
namestringrequired1–200 characters. Trimmed.
contentTypestringrequiredUp to 60 characters.
bytesintegerrequired≥ 1.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/images' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"contentType": "example",
"bytes": 1
}'Response 201
{
asset: {
id: string
name: string
key: string
url: string
contentType: string
bytes: number
status: "ready" | "uploading"
createdBy: string
createdAt: number
version: number
}
uploadUrl: string
}/ v1/ orgs/ :orgId/ marketing/ images/ :imageId/ finishFinishes an upload: the file is checked and the image goes on the CDN host.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).imageIdAn image's id in the Marketing content library (
mka_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/images/{imageId}/finish' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
image: {
id: string
name: string
key: string
url: string
contentType: string
bytes: number
status: "ready" | "uploading"
createdBy: string
createdAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ images/ :imageIdDeletes an image (messages already sent keep showing it until it expires from caches).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).imageIdAn image's id in the Marketing content library (
mka_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/images/{imageId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ orgs/ :orgId/ marketing/ previewA message as one person would get it (a contact or lead the caller can read, else placeholder values), in a scheme and device.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body (up to 977 KB)
campaignIdstringUp to 60 characters.
documentobjectValues: any JSON.
topicIdstringUp to 40 characters.
namestringUp to 120 characters.
recordIdstringUp to 40 characters.
scheme"light" | "dark"device"desktop" | "mobile"
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/preview' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"campaignId": "<campaignId>",
"document": {},
"topicId": "<topicId>"
}'Response 200
{
subject: string
preheader: string
html: string
text: string
bytes: number
clipped: boolean
problems: {
path: string
message: string
}[]
}/ v1/ orgs/ :orgId/ marketing/ testA test to one to five members: "[Test]" in the subject, links work but don't count.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body (up to 977 KB)
userIdsstring[]required1–5 items. Each up to 64 characters.
campaignIdstringUp to 60 characters.
documentobjectValues: any JSON.
topicIdstringUp to 40 characters.
namestringUp to 120 characters.
recordIdstringUp to 40 characters.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/test' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"userIds": [
"example"
]
}'Response 200
{
sent: string[]
}/ v1/ orgs/ :orgId/ marketing/ campaignsCampaigns, newest first, with their numbers once sending started (status narrows them).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Query parameters
limitintegerDefault
50. 1–200. Coerced from a string.cursorstringUp to 4,000 characters.
status"draft" | "pendingApproval" | "approved" | "scheduled" | "sending" | "sent" | "paused" | "cancelled" | "failed"
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
campaigns: {
stats?: {
queued: number
skipped: number
failed: number
rejected: number
unsubscribed: number
opened: number
bounced: number
complained: number
sent: number
delivered: number
softBounced: number
opens: number
machineOpens: number
clicked: number
clicks: number
machineClicks: number
conversions: number
revenue: number
}
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}[]
cursor?: string
}/ v1/ orgs/ :orgId/ marketing/ campaignsA draft: a name, a topic, an audience (segments and lists to include and exclude) and content (a document, a template, or the starter).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body (up to 977 KB)
namestringrequired1–120 characters. Trimmed.
topicIdstringrequiredUp to 40 characters.
audienceobjectDefault
{"include":[],"exclude":[]}.audience.include(object | object)[]requiredUp to 20 items.
audience.exclude(object | object)[]requiredUp to 20 items.
documentobjectValues: any JSON.
templateIdstringUp to 60 characters.
respectFrequencyCapboolean
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"topicId": "<topicId>"
}'Response 201
{
campaign: {
id: string
name: string
topicId: string
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignIdOne campaign, and while it's a draft what stops it being sent (problems).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
problems: {
path: string
message: string
}[]
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignIdChanges a draft over version; changing one waiting for approval, or approved, withdraws the request.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Request body (up to 977 KB)
namestring1–120 characters. Trimmed.
topicIdstringUp to 40 characters.
audienceobjectaudience.include(object | object)[]requiredUp to 20 items.
audience.exclude(object | object)[]requiredUp to 20 items.
documentobjectValues: any JSON.
respectFrequencyCapbooleanversionintegerrequired≥ 0.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignIdDeletes a campaign that never sent.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ duplicateA new draft with the same content and audience.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/duplicate' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 201
{
campaign: {
id: string
name: string
topicId: string
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ request-approvalAsks the org's approvers (other than the caller) to approve the campaign as it stands.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Request body
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/request-approval' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ decideAn approver approves or declines (never their own request).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Request body
decision"approved" | "declined"requiredcommentstringUp to 1,000 characters.
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/decide' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"decision": "approved",
"version": 1
}'Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ scheduleSchedules for at (epoch ms; now when left out), optionally spread over a day to each person's usual hour.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Request body
atintegersendTimeOptimisationbooleanversionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/schedule' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ unscheduleTakes a scheduled campaign back (an approval stays).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Request body
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/unschedule' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ pausePauses a sending campaign within a page of recipients.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/pause' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ resumeResumes a paused campaign where it stopped.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/resume' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ cancelCancels a scheduled, sending or paused campaign: nobody not yet sent it gets it.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/cancel' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ resultsThe campaign and its numbers (sent, delivered, opened, clicked, unsubscribed, bounced, conversions, revenue, …).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/results' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
campaign: {
status: "failed" | "approved" | "cancelled" | "paused" | "sent" | "draft" | "sending" | "scheduled" | "pendingApproval"
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
topicId: string
audience: {
include: {
segmentId?: string
listId?: string
}[]
exclude: {
segmentId?: string
listId?: string
}[]
}
document: {
subject: string
preheader?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
}[]
}
templateId?: string
schedule?: {
at: number
sendTimeOptimisation: boolean
}
respectFrequencyCap: boolean
links?: string[]
send?: {
startedAt: number
builtAt?: number
slots: number[]
slotsDone: number[]
recipients?: number
excluded?: number
duplicates?: number
finishedAt?: number
stopped?: string
}
createdBy: string
createdAt: number
updatedAt: number
version: number
}
stats: {
queued: number
skipped: number
failed: number
rejected: number
unsubscribed: number
opened: number
bounced: number
complained: number
sent: number
delivered: number
softBounced: number
opens: number
machineOpens: number
clicked: number
clicks: number
machineClicks: number
conversions: number
revenue: number
}
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ recipientsThe send's recipients and what happened to each, a page at a time.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Query parameters
limitintegerDefault
50. 1–200. Coerced from a string.cursorstringUp to 4,000 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/recipients' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
recipients: {
clickedAt?: number
openedAt?: number
delivery?: string
sentAt?: number
reason?: string
recordId?: string
address: string
status: string
slot: number
}[]
cursor?: string
}/ v1/ orgs/ :orgId/ marketing/ campaigns/ :campaignId/ conversionsWon opportunities credited to the campaign, newest first.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).campaignIdA Marketing campaign's id (
cpn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/campaigns/{campaignId}/conversions' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
conversions: {
opportunityId: string
name: string
amount: number
address: string
sendId: string
touchedAt: number
at: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ journeysJourneys, newest first, with how many people entered, are in them, completed and met the goal.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
journeys: {
totals: {
entered: number
active: number
completed: number
goal: number
}
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: object
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object
otherwise: object
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: object
no: object
} | {
kind: "random"
branches: object
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ journeysA draft journey (the definition is checked when it's published; problems lists what's missing).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body (up to 977 KB)
namestringrequired1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
definitionobjectValues: any JSON.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example"
}'Response 201
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ sms-estimateWhat a text step costs per message to each priced destination, for its text as written.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body
textstringrequiredUp to 2,000 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/sms-estimate' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"text": "example"
}'Response 200
{
parts: number
currency: string
perMessage: {
prefix: string
country: string
cost: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyIdOne journey with its draft, versions and approval, and what stops the draft going live (problems).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
problems: {
path: string
message: string
stepId?: string
}[]
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyIdChanges the name, description or draft over version; the live version is untouched until the next publish.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Request body (up to 977 KB)
namestring1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
definitionobjectValues: any JSON.
versionintegerrequired≥ 0.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyIdDeletes a journey that never went live.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ duplicateA new draft journey from this one's draft.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/duplicate' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 201
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ request-approvalAsks the org's approvers (other than the caller) to approve the draft as it stands.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Request body
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/request-approval' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ decideAn approver approves or declines the draft (never their own request).
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Request body
decision"approved" | "declined"requiredcommentstringUp to 1,000 characters.
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/decide' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"decision": "approved",
"version": 1
}'Response 200
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ publishPublishes the draft as the next version and runs it; people already in it stay on theirs.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Request body
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/publish' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ pausePauses a running journey: nobody enters and nobody moves on until it resumes.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/pause' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ resumeResumes a paused journey: everyone carries on from where they held.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/resume' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ stopStops a journey for good: everyone in it leaves.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/stop' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
journey: {
approval?: {
state: "pending" | "expired" | "approved" | "declined" | "withdrawn"
requestedBy: string
requestedAt: number
expiresAt: number
approvers: string[]
needed: "all" | "one"
decisions: {
userId: string
decision: "approved" | "declined"
at: number
comment?: string
}[]
fingerprint: string
decidedAt?: number
}
id: string
name: string
description?: string
status: "stopped" | "running" | "paused" | "draft"
draft: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
published?: number
versions: {
version: number
publishedAt: number
publishedBy: string
}[]
nextEntryAt?: number
stopped?: string
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ enterPuts someone into a journey that takes entries by API: a Customers record, or an address with merge fields.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Request body
recordIdstringUp to 40 characters.
emailstringUp to 254 characters.
phonestringUp to 32 characters.
fieldsobjectKeys up to 40 characters. Values: string (up to 500 characters).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/enter' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"recordId": "<recordId>",
"email": "person@example.com",
"phone": "example"
}'Response 200
{
result: "closed" | "entered" | "already" | "reentry" | "noAddress"
key?: string
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ peopleThe journey's people and where each is, a page at a time.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Query parameters
limitintegerDefault
50. 1–200. Coerced from a string.cursorstringUp to 4,000 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/people' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
people: {
key: string
email?: string
phone?: string
recordId?: string
version: number
run: number
status: "active" | "running" | "waiting" | "completed" | "goal" | "exited"
step?: string
due?: number
enteredAt: number
finishedAt?: number
via: "form" | "record" | "api" | "segment"
}[]
cursor?: string
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ people/ :keyOne person in the journey, by their email, mobile or rec:<record id>.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).keyVariable name; under
marketingjourneys a person's key: their email address, mobile (E.164) orrec:<record id>, URL-encoded.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/people/{key}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
person: {
key: string
email?: string
phone?: string
recordId?: string
version: number
run: number
status: "active" | "running" | "waiting" | "completed" | "goal" | "exited"
step?: string
due?: number
enteredAt: number
finishedAt?: number
via: "form" | "record" | "api" | "segment"
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ statsTotals, each step's numbers (entered, completed, exited, goal reached) and each email and text step's send.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/stats' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
stats: {
totals: {
entered: number
active: number
completed: number
exited: number
goal: number
conversions: number
revenue: number
}
steps: {
[key: string]: {
entered: number
completed: number
exited: number
goal: number
}
}
sends: {
[key: string]: {
queued: number
skipped: number
failed: number
rejected: number
unsubscribed: number
opened: number
bounced: number
complained: number
sent: number
delivered: number
softBounced: number
opens: number
machineOpens: number
clicked: number
clicks: number
machineClicks: number
conversions: number
revenue: number
}
}
}
}/ v1/ orgs/ :orgId/ marketing/ journeys/ :journeyId/ versions/ :versionA published version as it was frozen.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).journeyIdA Marketing journey's id (
jrn_…).versionA published journey version's number (1, 2, …).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/journeys/{journeyId}/versions/{version}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
version: {
journeyId: string
version: number
name: string
definition: {
entry: {
type: "segment"
segmentId: string
every: "day" | "hour" | "week"
} | {
type: "form"
formId: string
} | {
type: "record"
object: "contact" | "lead"
when: "matched" | "created" | "updated"
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
} | {
type: "api"
}
reentry: {
mode: "never"
} | {
mode: "after"
days: number
} | {
mode: "anytime"
}
goal?: {
filters: {
field: string
op: "in" | "startsWith" | "eq" | "contains" | "lte" | "gt" | "lt" | "ne" | "gte" | "blank" | "notBlank"
value?: unknown
}[]
}
start?: string
steps: {
id: string
name?: string
position?: {
x: number
y: number
}
type: "email"
topicId: string
document: {
subject: string
preheader?: string
blocks: object[]
}
respectFrequencyCap?: boolean
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "sms"
topicId: string
text: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "push"
title: string
body: string
to: "owner" | "members"
userIds?: string[]
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "wait"
wait: {
kind: "duration"
minutes: number
} | {
kind: "until"
at: number
} | {
kind: "weekday"
days: number[]
hour: number
minute: number
}
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "split"
split: {
kind: "attribute"
branches: object[]
otherwise: {
id: string
label: string
next?: string
}
} | {
kind: "engagement"
stepId: string
event: "opened" | "clicked"
yes: {
id: string
label: string
next?: string
}
no: {
id: string
label: string
next?: string
}
} | {
kind: "random"
branches: object[]
}
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "update"
field: string
value: unknown
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "addToList"
listId: string
next?: string
} | {
id: string
name?: string
position?: {
x: number
y: number
}
type: "exit"
}[]
}
links: {
[key: string]: string[]
}
publishedAt: number
publishedBy: string
}
}/ v1/ orgs/ :orgId/ marketing/ formsForms with their submission and spam counts.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/forms' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
forms: {
stats: {
submissions: number
spam: number
}
id: string
name: string
description?: string
object: "contact" | "lead"
fields: {
id: string
label: string
type: "text" | "email" | "hidden" | "phone" | "textarea" | "select" | "checkbox"
required?: boolean
placeholder?: string
options?: string[]
maps?: string
param?: string
value?: string
}[]
defaults: {
[key: string]: unknown
}
consent?: {
topicIds: string[]
text: string
wording: number
required: boolean
sms?: boolean
}
wordings: {
version: number
text: string
at: number
}[]
submitLabel: string
successMessage: string
redirectUrl?: string
status: "open" | "closed"
createdBy: string
createdAt: number
updatedAt: number
version: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ formsA form: fields mapped to lead or contact fields, defaults, a consent box (topics and wording) and what happens after.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body
namestringrequired1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
object"lead" | "contact"requiredfieldsobject[]required1–30 items.
fields[].idstringrequiredUp to 40 characters.
fields[].labelstringDefault
"". Up to 200 characters.fields[].type"text" | "email" | "phone" | "textarea" | "select" | "checkbox" | "hidden"requiredfields[].requiredbooleanfields[].placeholderstringUp to 200 characters.
fields[].optionsstring[]Up to 50 items. Each up to 100 characters.
fields[].mapsstringUp to 60 characters.
fields[].paramstringUp to 60 characters.
fields[].valuestringUp to 500 characters.
defaultsobjectKeys up to 60 characters. Values: any JSON.
consentobjector nullconsent.topicIdsstring[]required1–20 items. Each up to 40 characters.
consent.textstringrequiredUp to 1,000 characters.
consent.requiredbooleanrequiredconsent.smsbooleansubmitLabelstringUp to 40 characters.
successMessagestringUp to 1,000 characters.
redirectUrlstringUp to 2,000 characters.
status"open" | "closed"
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/forms' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"object": "lead",
"fields": [
{
"id": "<id>",
"type": "text"
}
]
}'Response 201
{
form: {
id: string
name: string
description?: string
object: "contact" | "lead"
fields: {
id: string
label: string
type: "text" | "email" | "hidden" | "phone" | "textarea" | "select" | "checkbox"
required?: boolean
placeholder?: string
options?: string[]
maps?: string
param?: string
value?: string
}[]
defaults: {
[key: string]: unknown
}
consent?: {
topicIds: string[]
text: string
wording: number
required: boolean
sms?: boolean
}
wordings: {
version: number
text: string
at: number
}[]
submitLabel: string
successMessage: string
redirectUrl?: string
status: "open" | "closed"
createdBy: string
createdAt: number
updatedAt: number
version: number
}
embed: string
}/ v1/ orgs/ :orgId/ marketing/ forms/ :formIdOne form, with its consent wordings and the HTML that embeds it.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).formIdA Marketing form's id (
mkf_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/forms/{formId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
form: {
id: string
name: string
description?: string
object: "contact" | "lead"
fields: {
id: string
label: string
type: "text" | "email" | "hidden" | "phone" | "textarea" | "select" | "checkbox"
required?: boolean
placeholder?: string
options?: string[]
maps?: string
param?: string
value?: string
}[]
defaults: {
[key: string]: unknown
}
consent?: {
topicIds: string[]
text: string
wording: number
required: boolean
sms?: boolean
}
wordings: {
version: number
text: string
at: number
}[]
submitLabel: string
successMessage: string
redirectUrl?: string
status: "open" | "closed"
createdBy: string
createdAt: number
updatedAt: number
version: number
}
embed: string
}/ v1/ orgs/ :orgId/ marketing/ forms/ :formIdReplaces a form over version; a new consent wording becomes a new version and the old ones are kept.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).formIdA Marketing form's id (
mkf_…).
Request body
namestringrequired1–120 characters. Trimmed.
descriptionstringUp to 500 characters.
object"lead" | "contact"requiredfieldsobject[]required1–30 items.
fields[].idstringrequiredUp to 40 characters.
fields[].labelstringDefault
"". Up to 200 characters.fields[].type"text" | "email" | "phone" | "textarea" | "select" | "checkbox" | "hidden"requiredfields[].requiredbooleanfields[].placeholderstringUp to 200 characters.
fields[].optionsstring[]Up to 50 items. Each up to 100 characters.
fields[].mapsstringUp to 60 characters.
fields[].paramstringUp to 60 characters.
fields[].valuestringUp to 500 characters.
defaultsobjectKeys up to 60 characters. Values: any JSON.
consentobjector nullconsent.topicIdsstring[]required1–20 items. Each up to 40 characters.
consent.textstringrequiredUp to 1,000 characters.
consent.requiredbooleanrequiredconsent.smsbooleansubmitLabelstringUp to 40 characters.
successMessagestringUp to 1,000 characters.
redirectUrlstringUp to 2,000 characters.
status"open" | "closed"versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X PUT 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/forms/{formId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"object": "lead",
"fields": [
{
"id": "<id>",
"type": "text"
}
],
"version": 1
}'Response 200
{
form: {
id: string
name: string
description?: string
object: "contact" | "lead"
fields: {
id: string
label: string
type: "text" | "email" | "hidden" | "phone" | "textarea" | "select" | "checkbox"
required?: boolean
placeholder?: string
options?: string[]
maps?: string
param?: string
value?: string
}[]
defaults: {
[key: string]: unknown
}
consent?: {
topicIds: string[]
text: string
wording: number
required: boolean
sms?: boolean
}
wordings: {
version: number
text: string
at: number
}[]
submitLabel: string
successMessage: string
redirectUrl?: string
status: "open" | "closed"
createdBy: string
createdAt: number
updatedAt: number
version: number
}
embed: string
}/ v1/ orgs/ :orgId/ marketing/ forms/ :formIdDeletes a form no running journey enters people from.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).formIdA Marketing form's id (
mkf_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/forms/{formId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}/ v1/ orgs/ :orgId/ marketing/ forms/ :formId/ submissionsThe form's submissions, newest first.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).formIdA Marketing form's id (
mkf_…).
Query parameters
limitintegerDefault
50. 1–200. Coerced from a string.cursorstringUp to 4,000 characters.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/forms/{formId}/submissions' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
submissions: {
id: string
at: number
values: {
[key: string]: string
}
recordId?: string
record?: "failed" | "created" | "updated" | "found"
consent?: "sent" | "limited" | "unavailable" | "notNeeded" | "declined"
page?: string
ipHash?: string
}[]
cursor?: string
}/ v1/ orgs/ :orgId/ marketing/ pagesLanding pages with their views.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/pages' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
pages: {
views: number
id: string
name: string
slug: string
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
published?: {
document: {
title: string
description?: string
blocks: {
id: string
when?: object
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: object
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "divider"
} | {
id: string
when?: object
type: "spacer"
height: number
} | {
id: string
when?: object
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: object
stackOnMobile?: boolean
} | {
id: string
when?: object
type: "social"
links: object
align?: "left" | "center" | "right"
} | {
id: string
when?: object
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
at: number
by: string
}
status: "draft" | "published" | "unpublished"
createdBy: string
createdAt: number
updatedAt: number
version: number
}[]
}/ v1/ orgs/ :orgId/ marketing/ pagesA landing page: a block document with forms, at a slug in the org.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).
Request body (up to 977 KB)
namestringrequired1–120 characters. Trimmed.
slugstringrequiredUp to 64 characters.
documentobjectValues: any JSON.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/pages' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"slug": "example"
}'Response 201
{
page: {
id: string
name: string
slug: string
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object[], object[]]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
published?: {
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
at: number
by: string
}
status: "draft" | "published" | "unpublished"
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ pages/ :pageIdOne landing page (its draft and what was published) and its public address.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).pageIdPage id: a Notes page (
doc_…), or a Feed page (pgx_…) under/v1/messaging/social; undermarketinga landing page (mkp_…).
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/pages/{pageId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
page: {
id: string
name: string
slug: string
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object[], object[]]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
published?: {
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
at: number
by: string
}
status: "draft" | "published" | "unpublished"
createdBy: string
createdAt: number
updatedAt: number
version: number
}
url: null | string
}/ v1/ orgs/ :orgId/ marketing/ pages/ :pageIdChanges the draft, name or address over version.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).pageIdPage id: a Notes page (
doc_…), or a Feed page (pgx_…) under/v1/messaging/social; undermarketinga landing page (mkp_…).
Request body (up to 977 KB)
namestring1–120 characters. Trimmed.
slugstringUp to 64 characters.
documentobjectValues: any JSON.
versionintegerrequired≥ 0.
Errors
413The request is too large (1 MB at most).429Too many requests to Marketing this minute. Try again shortly.
curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/pages/{pageId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
page: {
id: string
name: string
slug: string
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object[], object[]]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
published?: {
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
at: number
by: string
}
status: "draft" | "published" | "unpublished"
createdBy: string
createdAt: number
updatedAt: number
version: number
}
}/ v1/ orgs/ :orgId/ marketing/ pages/ :pageId/ publishPuts the draft live at /p/<org>/<slug> on the Marketing app.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).pageIdPage id: a Notes page (
doc_…), or a Feed page (pgx_…) under/v1/messaging/social; undermarketinga landing page (mkp_…).
Request body
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/pages/{pageId}/publish' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
page: {
status: "published"
published: {
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
at: number
by: string
}
updatedAt: number
version: number
id: string
name: string
slug: string
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object[], object[]]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
createdBy: string
createdAt: number
}
}/ v1/ orgs/ :orgId/ marketing/ pages/ :pageId/ unpublishTakes a page down until it is published again.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).pageIdPage id: a Notes page (
doc_…), or a Feed page (pgx_…) under/v1/messaging/social; undermarketinga landing page (mkp_…).
Request body
versionintegerrequired≥ 0.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/pages/{pageId}/unpublish' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"version": 1
}'Response 200
{
page: {
status: "unpublished"
updatedAt: number
version: number
id: string
name: string
slug: string
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object[]
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "divider"
} | {
id: string
when?: {
filters: object[]
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object[]
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object[], object[]]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object[]
}
type: "social"
links: {
network: "x" | "website" | "facebook" | "instagram" | "linkedin" | "youtube" | "tiktok"
url: string
}[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object[]
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
published?: {
document: {
title: string
description?: string
blocks: {
id: string
when?: {
filters: object
}
type: "heading"
text: string
level: 2 | 1 | 3
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "text"
markdown: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "button"
label: string
url: string
align?: "left" | "center" | "right"
fullWidth?: boolean
} | {
id: string
when?: {
filters: object
}
type: "image"
src: string
alt: string
width?: number
href?: string
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "divider"
} | {
id: string
when?: {
filters: object
}
type: "spacer"
height: number
} | {
id: string
when?: {
filters: object
}
type: "columns"
ratio: "1:1" | "1:2" | "2:1"
columns: [object, object]
stackOnMobile?: boolean
} | {
id: string
when?: {
filters: object
}
type: "social"
links: object[]
align?: "left" | "center" | "right"
} | {
id: string
when?: {
filters: object
}
type: "footer"
markdown: string
} | {
id: string
type: "form"
formId: string
}[]
}
at: number
by: string
}
createdBy: string
createdAt: number
}
}/ v1/ orgs/ :orgId/ marketing/ pages/ :pageIdDeletes a landing page and frees its address.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- marketing:read
Path parameters
orgIdOrganization id (
org_…).pageIdPage id: a Notes page (
doc_…), or a Feed page (pgx_…) under/v1/messaging/social; undermarketinga landing page (mkp_…).
Query parameters
versionintegerrequired≥ 0. Coerced from a string.
Errors
429Too many requests to Marketing this minute. Try again shortly.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/marketing/pages/{pageId}?version=1' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
ok: true
}