API reference

Marketing

Settings, consent, lists, segments, content, campaigns, journeys, forms, landing pages and the public hooks.
GET/v1/hooks/marketing/c/:token

A tracked link: 302 to the send's link at that position (HEAD and scanners count as machine clicks).

Auth
None.

Path parameters

  • token

    A 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}'
Send it from this page with your session or a key.
GET/v1/hooks/marketing/o/:token

The open pixel: always the image; bad or test tokens record nothing.

Auth
None.

Path parameters

  • token

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

Response 200 with no body

POST/v1/hooks/marketing/u/:token

RFC 8058 one-click unsubscribe from everything (mail clients POST List-Unsubscribe=One-Click).

Auth
None.

Path parameters

  • token

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

Response 200

{
  ok: true
}
GET/v1/hooks/marketing/u/:token

The footer's Unsubscribe link: the preference centre, ready to unsubscribe (a GET never changes anything).

Auth
None.

Path parameters

  • token

    A 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}'
Send it from this page with your session or a key.
GET/v1/hooks/marketing/preferences/:token

The preference centre's address (masked), status and topics.

Auth
None.

Path parameters

  • token

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

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
  }
}
POST/v1/hooks/marketing/preferences/:token

Saves the preference centre: a choice per topic, or unsubscribe from everything.

Auth
None.

Path parameters

  • token

    A 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

  • topicsobject

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

Response 200

{
  page: {
    senderName: string
    address: string
    status: "none" | "pending" | "unsubscribed" | "subscribed" | "bounced" | "complained"
    topics: {
      id: string
      name: string
      description?: string
      subscribed: boolean
    }[]
  }
}
POST/v1/hooks/marketing/confirm/:token

Double opt-in: the confirmation page's Confirm button (a POST, so mail scanners can't confirm).

Auth
None.

Path parameters

  • token

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

Response 200

{
  senderName: string
  status: "pending" | "unsubscribed" | "subscribed" | "bounced" | "complained"
  topics: string[]
}
GET/v1/hooks/marketing/forms/:formId

A form as its page shows it, with a fresh ticket to send back.

Auth
None.

Path parameters

  • formId

    A Marketing form's id (mkf_…).

Errors

  • 404This form isn't taking submissions.
curl 'https://api.cactive.com.au/v1/hooks/marketing/forms/{formId}'
Send it from this page with your session or a key.

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
    }
  }
}
POST/v1/hooks/marketing/forms/:formId

A submission (values by field, the consent box, the ticket, the page and its query parameters).

Auth
None.

Path parameters

  • formId

    A Marketing form's id (mkf_…).

Request body (up to 63 KB)

  • valuesobjectrequired

    Keys up to 60 characters. Values: any JSON.

  • consentboolean
  • ticketstring

    Up to 1,000 characters.

  • pagestring

    Up to 2,000 characters.

  • queryobject

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

Response 200

{
  ok: true
  message: string
  redirectUrl?: string
  confirmation?: "sent" | "limited" | "unavailable" | "notNeeded"
}
GET/v1/hooks/marketing/pages/:org/:slug

A published landing page with its forms; view=1 counts a view.

Auth
None.

Path parameters

  • org

    Organization slug, as in the help center link; under marketing the slug a landing page lives under.

  • slug

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

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
        }
      }
    }
  }
}
GET/v1/orgs/:orgId/marketing/meta

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

Path parameters

  • orgId

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

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
  }
}
PUT/v1/orgs/:orgId/marketing/settings

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

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • senderobjectrequired
  • sender.namestringrequired

    Up to 100 characters.

  • sender.localPartstringrequired

    Up to 64 characters.

  • sender.domainstring

    Up to 253 characters.

  • sender.replyTostring

    Up to 254 characters.

  • physicalAddressstringrequired

    Up to 500 characters.

  • topicsobject[]required

    Up to 50 items.

  • topics[].idstringrequired

    Up to 40 characters.

  • topics[].namestringrequired

    Up to 80 characters.

  • topics[].descriptionstring

    Up to 300 characters.

  • topics[].basis"optIn" | "optOut"required
  • topics[].archivedboolean
  • approvalsobjectrequired
  • approvals.requiredbooleanrequired
  • approvals.approversstring[]required

    Up to 50 items. Each up to 64 characters.

  • approvals.needed"one" | "all"required
  • approvals.expiryDaysintegerrequired

    1–90.

  • frequencyCapobjectrequiredor null
  • frequencyCap.messagesintegerrequired

    1–100.

  • frequencyCap.daysintegerrequired

    1–90.

  • sendTimeobjectrequired
  • sendTime.defaultHourintegerrequired

    0–23.

  • sendTime.timeZonestringrequired

    Up to 64 characters.

  • utmobjectrequired
  • utm.enabledbooleanrequired
  • utm.sourcestringrequired

    Up to 100 characters.

  • utm.mediumstringrequired

    Up to 100 characters.

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

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
  }
}
PUT/v1/orgs/:orgId/marketing/brand

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

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • logoobject
  • logo.urlstringrequired

    Up to 2,000 characters.

  • logo.darkUrlstring

    Up to 2,000 characters.

  • logo.widthintegerrequired
  • logo.altstringrequired

    Up to 300 characters.

  • logo.hrefstring

    Up to 2,000 characters.

  • colorsobjectrequired
  • colors.pagestringrequired

    Up to 32 characters.

  • colors.cardstringrequired

    Up to 32 characters.

  • colors.textstringrequired

    Up to 32 characters.

  • colors.mutedstringrequired

    Up to 32 characters.

  • colors.linkstringrequired

    Up to 32 characters.

  • colors.buttonstringrequired

    Up to 32 characters.

  • colors.buttonTextstringrequired

    Up to 32 characters.

  • colors.borderstringrequired

    Up to 32 characters.

  • darkobject
  • dark.pagestring

    Up to 32 characters.

  • dark.cardstring

    Up to 32 characters.

  • dark.textstring

    Up to 32 characters.

  • dark.mutedstring

    Up to 32 characters.

  • dark.linkstring

    Up to 32 characters.

  • dark.buttonstring

    Up to 32 characters.

  • dark.buttonTextstring

    Up to 32 characters.

  • dark.borderstring

    Up to 32 characters.

  • font"system" | "serif" | "rounded" | "mono"required
  • radiusintegerrequired

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

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
  }
}
POST/v1/orgs/:orgId/marketing/resume

Lifts the reputation guard's pause once the audience is cleaned (Marketing admins).

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

Path parameters

  • orgId

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

Response 200

{
  resumedAt: number
}
GET/v1/orgs/:orgId/marketing/usage

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

Path parameters

  • orgId

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

Response 200

{
  usage: {
    month: number
    day: number
  }
  plan: {
    contacts: number
    sendsPerMonth: number
  }
}
GET/v1/orgs/:orgId/marketing/stats/daily

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

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • fromstring

    Up to 8 characters.

  • tostring

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

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
  }
}
GET/v1/orgs/:orgId/marketing/people/:address

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

Path parameters

  • orgId

    Organization id (org_…).

  • address

    An email address (URL-encoded): the alias, or the forwarding address; under marketing a 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"
Send it from this page with your session or a key.

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
    }
  }[]
}
GET/v1/orgs/:orgId/marketing/lists

Static and suppression lists with their member counts.

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

Path parameters

  • orgId

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

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
  }[]
}
POST/v1/orgs/:orgId/marketing/lists

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

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • namestringrequired

    1–120 characters. Trimmed.

  • descriptionstring

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

Response 201

{
  list: {
    id: string
    name: string
    description?: string
    kind: "static" | "suppression"
    channel: "email" | "sms"
    createdBy: string
    createdAt: number
    updatedAt: number
    version: number
  }
}
GET/v1/orgs/:orgId/marketing/lists/:listId

One list.

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

Path parameters

  • orgId

    Organization id (org_…).

  • listId

    Saved map id (mls_…); under marketing a list (mkl_…); under me/food a 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"
Send it from this page with your session or a key.

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
  }
}
PATCH/v1/orgs/:orgId/marketing/lists/:listId

Renames a list or changes its description, over version.

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

Path parameters

  • orgId

    Organization id (org_…).

  • listId

    Saved map id (mls_…); under marketing a list (mkl_…); under me/food a shopping list (fls_…).

Request body

  • namestring

    1–120 characters. Trimmed.

  • descriptionstring

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

Response 200

{
  list: {
    updatedAt: number
    version: number
    description?: string
    name: string
    id: string
    kind: "static" | "suppression"
    channel: "email" | "sms"
    createdBy: string
    createdAt: number
  }
}
DELETE/v1/orgs/:orgId/marketing/lists/:listId

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

Path parameters

  • orgId

    Organization id (org_…).

  • listId

    Saved map id (mls_…); under marketing a list (mkl_…); under me/food a 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}
GET/v1/orgs/:orgId/marketing/lists/:listId/members

A page of a list's members.

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

Path parameters

  • orgId

    Organization id (org_…).

  • listId

    Saved map id (mls_…); under marketing a list (mkl_…); under me/food a shopping list (fls_…).

Query parameters

  • limitinteger

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

  • cursorstring

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

Response 200

{
  members: {
    address: string
    fields: {
      [key: string]: string
    }
    recordId?: string
    addedAt: number
    source: "app" | "api" | "import" | "journey" | "segment"
  }[]
  cursor?: string
}
POST/v1/orgs/:orgId/marketing/lists/:listId/members

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

Path parameters

  • orgId

    Organization id (org_…).

  • listId

    Saved map id (mls_…); under marketing a list (mkl_…); under me/food a shopping list (fls_…).

Request body (up to 977 KB)

  • membersobject[]required

    1–1,000 items.

  • members[].addressstringrequired

    Up to 254 characters.

  • members[].fieldsobject

    Keys up to 40 characters. Values: string (up to 500 characters).

  • members[].recordIdstring

    Up to 40 characters.

  • consentobject
  • consent.topicsstring[]required

    Up to 20 items. Each up to 40 characters.

  • consent.notestringrequired

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

Response 200

{
  added: number
  existing: number
  invalid: number[]
  consented: number
}
POST/v1/orgs/:orgId/marketing/lists/:listId/members/remove

Removes people from a list by address.

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

Path parameters

  • orgId

    Organization id (org_…).

  • listId

    Saved map id (mls_…); under marketing a list (mkl_…); under me/food a shopping list (fls_…).

Request body

  • addressesstring[]required

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

Response 200

{
  removed: number
}
POST/v1/orgs/:orgId/marketing/lists/:listId/imports

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

Path parameters

  • orgId

    Organization id (org_…).

  • listId

    Saved map id (mls_…); under marketing a list (mkl_…); under me/food a shopping list (fls_…).

Request body (up to 977 KB)

  • fileNamestringrequired

    1–200 characters.

  • sizeintegerrequired

    ≥ 1.

  • contentstring

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

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
}
GET/v1/orgs/:orgId/marketing/imports/:jobId

A list import's progress: rows read, added, skipped and why.

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

Path parameters

  • orgId

    Organization id (org_…).

  • jobId

    Job id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a 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"
Send it from this page with your session or a key.

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
  }
}
GET/v1/orgs/:orgId/marketing/imports/:jobId/preview

The file's columns, a few rows and the suggested mapping.

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

Path parameters

  • orgId

    Organization id (org_…).

  • jobId

    Job id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a 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"
Send it from this page with your session or a key.

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
}
POST/v1/orgs/:orgId/marketing/imports/:jobId/start

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

Path parameters

  • orgId

    Organization id (org_…).

  • jobId

    Job id: an agent job (job_…), under pipelines a pipeline job (pjb_…), or under crm an import or export (cjb_…); under marketing a list import (mkj_…).

Request body

  • mappingstring[]required

    Up to 200 items. Each up to 60 characters.

  • consentobject
  • consent.topicsstring[]required

    Up to 20 items. Each up to 40 characters.

  • consent.notestringrequired

    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/imports/{jobId}/start' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "mapping": [
      "example"
    ]
  }'
Send it from this page with your session or a key.

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
  }
}
GET/v1/orgs/:orgId/marketing/segments

Segments, by name, with their last size estimate.

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

Path parameters

  • orgId

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

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
  }[]
}
POST/v1/orgs/:orgId/marketing/segments

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

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • namestringrequired

    1–120 characters. Trimmed.

  • descriptionstring

    Up to 500 characters.

  • groupsobject[]required

    1–50 items.

  • groups[].sourceobject | objectrequired
  • groups[].filtersobject[]

    Default []. Up to 20 items.

  • groups[].filters[].fieldstringrequired

    1–60 characters.

  • groups[].filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"required
  • groups[].filters[].valueany JSON
  • groups[].engagementobject[]

    Default []. Up to 10 items.

  • groups[].engagement[].event"sent" | "opened" | "clicked"required
  • groups[].engagement[].daysintegerrequired

    1–1100.

  • groups[].engagement[].negateboolean
  • groups[].listsobject[]

    Default []. Up to 10 items.

  • groups[].lists[].listIdstringrequired

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

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
  }
}
POST/v1/orgs/:orgId/marketing/segments/preview

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

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • groupsobject[]required

    1–50 items.

  • groups[].sourceobject | objectrequired
  • groups[].filtersobject[]

    Default []. Up to 20 items.

  • groups[].filters[].fieldstringrequired

    1–60 characters.

  • groups[].filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"required
  • groups[].filters[].valueany JSON
  • groups[].engagementobject[]

    Default []. Up to 10 items.

  • groups[].engagement[].event"sent" | "opened" | "clicked"required
  • groups[].engagement[].daysintegerrequired

    1–1100.

  • groups[].engagement[].negateboolean
  • groups[].listsobject[]

    Default []. Up to 10 items.

  • groups[].lists[].listIdstringrequired

    Up to 60 characters.

  • groups[].lists[].memberbooleanrequired
  • limitinteger

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

Response 200

{
  people: {
    address: string
    name?: string
    recordId?: string
    object?: string
  }[]
  more: boolean
}
GET/v1/orgs/:orgId/marketing/segments/:segmentId

One segment with its groups and estimate.

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

Path parameters

  • orgId

    Organization id (org_…).

  • segmentId

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

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
  }
}
PUT/v1/orgs/:orgId/marketing/segments/:segmentId

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

Path parameters

  • orgId

    Organization id (org_…).

  • segmentId

    A Marketing segment's id (seg_…).

Request body

  • namestringrequired

    1–120 characters. Trimmed.

  • descriptionstring

    Up to 500 characters.

  • groupsobject[]required

    1–50 items.

  • groups[].sourceobject | objectrequired
  • groups[].filtersobject[]

    Default []. Up to 20 items.

  • groups[].filters[].fieldstringrequired

    1–60 characters.

  • groups[].filters[].op"eq" | "ne" | "in" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith" | "blank" | "notBlank"required
  • groups[].filters[].valueany JSON
  • groups[].engagementobject[]

    Default []. Up to 10 items.

  • groups[].engagement[].event"sent" | "opened" | "clicked"required
  • groups[].engagement[].daysintegerrequired

    1–1100.

  • groups[].engagement[].negateboolean
  • groups[].listsobject[]

    Default []. Up to 10 items.

  • groups[].lists[].listIdstringrequired

    Up to 60 characters.

  • groups[].lists[].memberbooleanrequired
  • 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/segments/{segmentId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Example",
    "groups": [
      {
        "source": {}
      }
    ],
    "version": 1
  }'
Send it from this page with your session or a key.

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
  }
}
DELETE/v1/orgs/:orgId/marketing/segments/:segmentId

Deletes a segment no unsent campaign or running journey uses.

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

Path parameters

  • orgId

    Organization id (org_…).

  • segmentId

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

Response 200

{
  ok: true
}
POST/v1/orgs/:orgId/marketing/segments/:segmentId/estimate

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

Path parameters

  • orgId

    Organization id (org_…).

  • segmentId

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

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
  }
}
GET/v1/orgs/:orgId/marketing/templates

Templates campaigns start from.

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

Path parameters

  • orgId

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

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
  }[]
}
POST/v1/orgs/:orgId/marketing/templates

A template: a block document campaigns can start from.

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

Path parameters

  • orgId

    Organization id (org_…).

Request body (up to 977 KB)

  • namestringrequired

    1–120 characters. Trimmed.

  • descriptionstring

    Up to 500 characters.

  • documentobjectrequired

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

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
  }
}
GET/v1/orgs/:orgId/marketing/templates/:templateId

One template with its document.

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

Path parameters

  • orgId

    Organization id (org_…).

  • templateId

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

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
  }
}
PATCH/v1/orgs/:orgId/marketing/templates/:templateId

Changes a template's name, description or document over version.

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

Path parameters

  • orgId

    Organization id (org_…).

  • templateId

    A Marketing template's id (tpl_…).

Request body (up to 977 KB)

  • namestring

    1–120 characters. Trimmed.

  • descriptionstring

    Up to 500 characters.

  • documentobject

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

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
  }
}
DELETE/v1/orgs/:orgId/marketing/templates/:templateId

Deletes a template (campaigns made from it keep their copy).

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

Path parameters

  • orgId

    Organization id (org_…).

  • templateId

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

Response 200

{
  ok: true
}
GET/v1/orgs/:orgId/marketing/blocks

Saved blocks in the content library.

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

Path parameters

  • orgId

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

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
  }[]
}
POST/v1/orgs/:orgId/marketing/blocks

Saves a block (with its columns, if any) to the content library.

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

Path parameters

  • orgId

    Organization id (org_…).

Request body (up to 977 KB)

  • namestringrequired

    1–120 characters. Trimmed.

  • blockobjectrequired

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

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
  }
}
DELETE/v1/orgs/:orgId/marketing/blocks/:blockId

Deletes a saved block.

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

Path parameters

  • orgId

    Organization id (org_…).

  • blockId

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

Response 200

{
  ok: true
}
GET/v1/orgs/:orgId/marketing/images

Images on the content library's CDN host.

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

Path parameters

  • orgId

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

Response 200

{
  images: {
    id: string
    name: string
    key: string
    url: string
    contentType: string
    bytes: number
    status: "ready" | "uploading"
    createdBy: string
    createdAt: number
    version: number
  }[]
}
POST/v1/orgs/:orgId/marketing/images

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

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • namestringrequired

    1–200 characters. Trimmed.

  • contentTypestringrequired

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

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
}
POST/v1/orgs/:orgId/marketing/images/:imageId/finish

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

Path parameters

  • orgId

    Organization id (org_…).

  • imageId

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

Response 200

{
  image: {
    id: string
    name: string
    key: string
    url: string
    contentType: string
    bytes: number
    status: "ready" | "uploading"
    createdBy: string
    createdAt: number
    version: number
  }
}
DELETE/v1/orgs/:orgId/marketing/images/:imageId

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

Path parameters

  • orgId

    Organization id (org_…).

  • imageId

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

Response 200

{
  ok: true
}
POST/v1/orgs/:orgId/marketing/preview

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

Path parameters

  • orgId

    Organization id (org_…).

Request body (up to 977 KB)

  • campaignIdstring

    Up to 60 characters.

  • documentobject

    Values: any JSON.

  • topicIdstring

    Up to 40 characters.

  • namestring

    Up to 120 characters.

  • recordIdstring

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

Response 200

{
  subject: string
  preheader: string
  html: string
  text: string
  bytes: number
  clipped: boolean
  problems: {
    path: string
    message: string
  }[]
}
POST/v1/orgs/:orgId/marketing/test

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

Path parameters

  • orgId

    Organization id (org_…).

Request body (up to 977 KB)

  • userIdsstring[]required

    1–5 items. Each up to 64 characters.

  • campaignIdstring

    Up to 60 characters.

  • documentobject

    Values: any JSON.

  • topicIdstring

    Up to 40 characters.

  • namestring

    Up to 120 characters.

  • recordIdstring

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

Response 200

{
  sent: string[]
}
GET/v1/orgs/:orgId/marketing/campaigns

Campaigns, newest first, with their numbers once sending started (status narrows them).

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

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • limitinteger

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

  • cursorstring

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

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
}
POST/v1/orgs/:orgId/marketing/campaigns

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

Path parameters

  • orgId

    Organization id (org_…).

Request body (up to 977 KB)

  • namestringrequired

    1–120 characters. Trimmed.

  • topicIdstringrequired

    Up to 40 characters.

  • audienceobject

    Default {"include":[],"exclude":[]}.

  • audience.include(object | object)[]required

    Up to 20 items.

  • audience.exclude(object | object)[]required

    Up to 20 items.

  • documentobject

    Values: any JSON.

  • templateIdstring

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

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
  }
}
GET/v1/orgs/:orgId/marketing/campaigns/:campaignId

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

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
  }[]
}
PATCH/v1/orgs/:orgId/marketing/campaigns/:campaignId

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

    A Marketing campaign's id (cpn_…).

Request body (up to 977 KB)

  • namestring

    1–120 characters. Trimmed.

  • topicIdstring

    Up to 40 characters.

  • audienceobject
  • audience.include(object | object)[]required

    Up to 20 items.

  • audience.exclude(object | object)[]required

    Up to 20 items.

  • documentobject

    Values: any JSON.

  • respectFrequencyCapboolean
  • 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/campaigns/{campaignId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "version": 1
  }'
Send it from this page with your session or a key.

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
  }
}
DELETE/v1/orgs/:orgId/marketing/campaigns/:campaignId

Deletes a campaign that never sent.

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

Response 200

{
  ok: true
}
POST/v1/orgs/:orgId/marketing/campaigns/:campaignId/duplicate

A new draft with the same content and audience.

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/campaigns/:campaignId/request-approval

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/campaigns/:campaignId/decide

An approver approves or declines (never their own request).

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

    A Marketing campaign's id (cpn_…).

Request body

  • decision"approved" | "declined"required
  • commentstring

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

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
  }
}
POST/v1/orgs/:orgId/marketing/campaigns/:campaignId/schedule

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

    A Marketing campaign's id (cpn_…).

Request body

  • atinteger
  • sendTimeOptimisationboolean
  • 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}/schedule' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "version": 1
  }'
Send it from this page with your session or a key.

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
  }
}
POST/v1/orgs/:orgId/marketing/campaigns/:campaignId/unschedule

Takes a scheduled campaign back (an approval stays).

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/campaigns/:campaignId/pause

Pauses a sending campaign within a page of recipients.

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/campaigns/:campaignId/resume

Resumes a paused campaign where it stopped.

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/campaigns/:campaignId/cancel

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

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
  }
}
GET/v1/orgs/:orgId/marketing/campaigns/:campaignId/results

The campaign and its numbers (sent, delivered, opened, clicked, unsubscribed, bounced, conversions, revenue, …).

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

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
  }
}
GET/v1/orgs/:orgId/marketing/campaigns/:campaignId/recipients

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

    A Marketing campaign's id (cpn_…).

Query parameters

  • limitinteger

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

  • cursorstring

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

Response 200

{
  recipients: {
    clickedAt?: number
    openedAt?: number
    delivery?: string
    sentAt?: number
    reason?: string
    recordId?: string
    address: string
    status: string
    slot: number
  }[]
  cursor?: string
}
GET/v1/orgs/:orgId/marketing/campaigns/:campaignId/conversions

Won opportunities credited to the campaign, newest first.

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

Path parameters

  • orgId

    Organization id (org_…).

  • campaignId

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

Response 200

{
  conversions: {
    opportunityId: string
    name: string
    amount: number
    address: string
    sendId: string
    touchedAt: number
    at: number
  }[]
}
GET/v1/orgs/:orgId/marketing/journeys

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

Path parameters

  • orgId

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

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
  }[]
}
POST/v1/orgs/:orgId/marketing/journeys

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

Path parameters

  • orgId

    Organization id (org_…).

Request body (up to 977 KB)

  • namestringrequired

    1–120 characters. Trimmed.

  • descriptionstring

    Up to 500 characters.

  • definitionobject

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

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
  }
}
POST/v1/orgs/:orgId/marketing/journeys/sms-estimate

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

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • textstringrequired

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

Response 200

{
  parts: number
  currency: string
  perMessage: {
    prefix: string
    country: string
    cost: number
  }[]
}
GET/v1/orgs/:orgId/marketing/journeys/:journeyId

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

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
  }[]
}
PATCH/v1/orgs/:orgId/marketing/journeys/:journeyId

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

    A Marketing journey's id (jrn_…).

Request body (up to 977 KB)

  • namestring

    1–120 characters. Trimmed.

  • descriptionstring

    Up to 500 characters.

  • definitionobject

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

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
  }
}
DELETE/v1/orgs/:orgId/marketing/journeys/:journeyId

Deletes a journey that never went live.

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

Response 200

{
  ok: true
}
POST/v1/orgs/:orgId/marketing/journeys/:journeyId/duplicate

A new draft journey from this one's draft.

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/journeys/:journeyId/request-approval

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/journeys/:journeyId/decide

An approver approves or declines the draft (never their own request).

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

    A Marketing journey's id (jrn_…).

Request body

  • decision"approved" | "declined"required
  • commentstring

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

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
  }
}
POST/v1/orgs/:orgId/marketing/journeys/:journeyId/publish

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/journeys/:journeyId/pause

Pauses a running journey: nobody enters and nobody moves on until it resumes.

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/journeys/:journeyId/resume

Resumes a paused journey: everyone carries on from where they held.

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/journeys/:journeyId/stop

Stops a journey for good: everyone in it leaves.

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

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
  }
}
POST/v1/orgs/:orgId/marketing/journeys/:journeyId/enter

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

    A Marketing journey's id (jrn_…).

Request body

  • recordIdstring

    Up to 40 characters.

  • emailstring

    Up to 254 characters.

  • phonestring

    Up to 32 characters.

  • fieldsobject

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

Response 200

{
  result: "closed" | "entered" | "already" | "reentry" | "noAddress"
  key?: string
}
GET/v1/orgs/:orgId/marketing/journeys/:journeyId/people

The journey's people and where each is, a page at a time.

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

    A Marketing journey's id (jrn_…).

Query parameters

  • limitinteger

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

  • cursorstring

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

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
}
GET/v1/orgs/:orgId/marketing/journeys/:journeyId/people/:key

One person in the journey, by their email, mobile or rec:<record id>.

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

    A Marketing journey's id (jrn_…).

  • key

    Variable name; under marketing journeys a person's key: their email address, mobile (E.164) or rec:<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"
Send it from this page with your session or a key.

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"
  }
}
GET/v1/orgs/:orgId/marketing/journeys/:journeyId/stats

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

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

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
      }
    }
  }
}
GET/v1/orgs/:orgId/marketing/journeys/:journeyId/versions/:version

A published version as it was frozen.

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

Path parameters

  • orgId

    Organization id (org_…).

  • journeyId

    A Marketing journey's id (jrn_…).

  • version

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

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
  }
}
GET/v1/orgs/:orgId/marketing/forms

Forms with their submission and spam counts.

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

Path parameters

  • orgId

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

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
  }[]
}
POST/v1/orgs/:orgId/marketing/forms

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

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • namestringrequired

    1–120 characters. Trimmed.

  • descriptionstring

    Up to 500 characters.

  • object"lead" | "contact"required
  • fieldsobject[]required

    1–30 items.

  • fields[].idstringrequired

    Up to 40 characters.

  • fields[].labelstring

    Default "". Up to 200 characters.

  • fields[].type"text" | "email" | "phone" | "textarea" | "select" | "checkbox" | "hidden"required
  • fields[].requiredboolean
  • fields[].placeholderstring

    Up to 200 characters.

  • fields[].optionsstring[]

    Up to 50 items. Each up to 100 characters.

  • fields[].mapsstring

    Up to 60 characters.

  • fields[].paramstring

    Up to 60 characters.

  • fields[].valuestring

    Up to 500 characters.

  • defaultsobject

    Keys up to 60 characters. Values: any JSON.

  • consentobjector null
  • consent.topicIdsstring[]required

    1–20 items. Each up to 40 characters.

  • consent.textstringrequired

    Up to 1,000 characters.

  • consent.requiredbooleanrequired
  • consent.smsboolean
  • submitLabelstring

    Up to 40 characters.

  • successMessagestring

    Up to 1,000 characters.

  • redirectUrlstring

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

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
}
GET/v1/orgs/:orgId/marketing/forms/:formId

One form, with its consent wordings and the HTML that embeds it.

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

Path parameters

  • orgId

    Organization id (org_…).

  • formId

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

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
}
PUT/v1/orgs/:orgId/marketing/forms/:formId

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

Path parameters

  • orgId

    Organization id (org_…).

  • formId

    A Marketing form's id (mkf_…).

Request body

  • namestringrequired

    1–120 characters. Trimmed.

  • descriptionstring

    Up to 500 characters.

  • object"lead" | "contact"required
  • fieldsobject[]required

    1–30 items.

  • fields[].idstringrequired

    Up to 40 characters.

  • fields[].labelstring

    Default "". Up to 200 characters.

  • fields[].type"text" | "email" | "phone" | "textarea" | "select" | "checkbox" | "hidden"required
  • fields[].requiredboolean
  • fields[].placeholderstring

    Up to 200 characters.

  • fields[].optionsstring[]

    Up to 50 items. Each up to 100 characters.

  • fields[].mapsstring

    Up to 60 characters.

  • fields[].paramstring

    Up to 60 characters.

  • fields[].valuestring

    Up to 500 characters.

  • defaultsobject

    Keys up to 60 characters. Values: any JSON.

  • consentobjector null
  • consent.topicIdsstring[]required

    1–20 items. Each up to 40 characters.

  • consent.textstringrequired

    Up to 1,000 characters.

  • consent.requiredbooleanrequired
  • consent.smsboolean
  • submitLabelstring

    Up to 40 characters.

  • successMessagestring

    Up to 1,000 characters.

  • redirectUrlstring

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

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
}
DELETE/v1/orgs/:orgId/marketing/forms/:formId

Deletes a form no running journey enters people from.

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

Path parameters

  • orgId

    Organization id (org_…).

  • formId

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

Response 200

{
  ok: true
}
GET/v1/orgs/:orgId/marketing/forms/:formId/submissions

The form's submissions, newest first.

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

Path parameters

  • orgId

    Organization id (org_…).

  • formId

    A Marketing form's id (mkf_…).

Query parameters

  • limitinteger

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

  • cursorstring

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

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
}
GET/v1/orgs/:orgId/marketing/pages

Landing pages with their views.

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

Path parameters

  • orgId

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

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
  }[]
}
POST/v1/orgs/:orgId/marketing/pages

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

Path parameters

  • orgId

    Organization id (org_…).

Request body (up to 977 KB)

  • namestringrequired

    1–120 characters. Trimmed.

  • slugstringrequired

    Up to 64 characters.

  • documentobject

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

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
  }
}
GET/v1/orgs/:orgId/marketing/pages/:pageId

One landing page (its draft and what was published) and its public address.

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

Path parameters

  • orgId

    Organization id (org_…).

  • pageId

    Page id: a Notes page (doc_…), or a Feed page (pgx_…) under /v1/messaging/social; under marketing a 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"
Send it from this page with your session or a key.

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
}
PATCH/v1/orgs/:orgId/marketing/pages/:pageId

Changes the draft, name or address over version.

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

Path parameters

  • orgId

    Organization id (org_…).

  • pageId

    Page id: a Notes page (doc_…), or a Feed page (pgx_…) under /v1/messaging/social; under marketing a landing page (mkp_…).

Request body (up to 977 KB)

  • namestring

    1–120 characters. Trimmed.

  • slugstring

    Up to 64 characters.

  • documentobject

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

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
  }
}
POST/v1/orgs/:orgId/marketing/pages/:pageId/publish

Puts the draft live at /p/<org>/<slug> on the Marketing app.

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

Path parameters

  • orgId

    Organization id (org_…).

  • pageId

    Page id: a Notes page (doc_…), or a Feed page (pgx_…) under /v1/messaging/social; under marketing a 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
  }'
Send it from this page with your session or a key.

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
  }
}
POST/v1/orgs/:orgId/marketing/pages/:pageId/unpublish

Takes a page down until it is published again.

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

Path parameters

  • orgId

    Organization id (org_…).

  • pageId

    Page id: a Notes page (doc_…), or a Feed page (pgx_…) under /v1/messaging/social; under marketing a 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
  }'
Send it from this page with your session or a key.

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
  }
}
DELETE/v1/orgs/:orgId/marketing/pages/:pageId

Deletes a landing page and frees its address.

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

Path parameters

  • orgId

    Organization id (org_…).

  • pageId

    Page id: a Notes page (doc_…), or a Feed page (pgx_…) under /v1/messaging/social; under marketing a 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"
Send it from this page with your session or a key.

Response 200

{
  ok: true
}