API reference

Mirage

Servers, channels, threads, messages, search, emoji, roles, invites, direct messages and live events.
GET/v1/hooks/messaging/servers/:serverId/icon

A server's icon image (a redirect, cached for 50 minutes); 404 when it has none or uses an emoji. No authentication.

Auth
None.

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 404No icon.
curl 'https://api.cactive.com.au/v1/hooks/messaging/servers/{serverId}/icon'
Send it from this page with your session or a key.
GET/v1/hooks/messaging/emojis/:emojiId

An emoji's image (a redirect, cached for 50 minutes): a server's (mem_…), or one of Discord's copied across the bridge (dce_<id>). No authentication.

Auth
None.

Path parameters

  • emojiId

    Mirage emoji id (mem_…).

Errors

  • 404Emoji not found.
curl 'https://api.cactive.com.au/v1/hooks/messaging/emojis/{emojiId}'
Send it from this page with your session or a key.
GET/v1/hooks/messaging/stickers/:stickerId

A sticker's image (a redirect): a server's (mst_…), or one of Discord's copied across the bridge (dst_<id>). No authentication.

Auth
None.

Path parameters

  • stickerId

    Mirage sticker id (mst_…; Discord's from the bridge are dst_<id>).

Errors

  • 404Sticker not found.
curl 'https://api.cactive.com.au/v1/hooks/messaging/stickers/{stickerId}'
Send it from this page with your session or a key.
GET/v1/hooks/messaging/gif-preview/:provider/:sig

A GIF picker preview (a redirect to Mirage's copy): u is one of the provider's media links as GET /v1/messaging/gifs signed it; copied into Mirage's files once, so viewers never load the provider's hosts. No authentication.

Auth
None.

Path parameters

  • provider

    GIF provider: klipy or giphy.

  • sig

    Mirage's signature of the preview link (u), from GET /v1/messaging/gifs.

Query parameters

  • ustring

    Default "".

Errors

  • 404Preview not found.
curl 'https://api.cactive.com.au/v1/hooks/messaging/gif-preview/{provider}/{sig}'
Send it from this page with your session or a key.
GET/v1/hooks/messaging/sounds/:soundId

A sound's file (a redirect). No authentication.

Auth
None.

Path parameters

  • soundId

    Mirage soundboard sound id (msd_…).

Errors

  • 404Sound not found.
curl 'https://api.cactive.com.au/v1/hooks/messaging/sounds/{soundId}'
Send it from this page with your session or a key.
GET/v1/hooks/messaging/servers/:serverId/page

A community server's public page (when its owners turned it on): name, icon, banner, description, traits, member count and a lasting invite. No authentication.

Auth
None.

Path parameters

  • serverId

    Mirage server id (gld_…).

curl 'https://api.cactive.com.au/v1/hooks/messaging/servers/{serverId}/page'
Send it from this page with your session or a key.

Response 200

{
  page: {
    serverId: string
    name: string
    icon: null | string
    banner: null | string
    description: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    memberCount: number
    createdAt: number
    inviteUrl: null | string
  }
}
GET/v1/hooks/messaging/invites/:code

An invite's preview without signing in (link previews of the invite page): the server's name, icon, description, member and online counts; 404 when it's expired. Limited per address a minute. No authentication.

Auth
None.

Path parameters

  • code

    Mirage invite code (8 letters and digits); under me/food a household invitation's code (from its link).

curl 'https://api.cactive.com.au/v1/hooks/messaging/invites/{code}'
Send it from this page with your session or a key.

Response 200

{
  code: string
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    memberCount: number
    onlineCount: number
  }
  channel: {
    channelId: string
    name: null | string
  }
  member?: boolean
}
POST/v1/hooks/messaging/incoming/:webhookId/:token

Posts in the webhook's channel with Discord's payload: content (Markdown; people as <@usr_…>), username (instead of the webhook's name) and embeds (title, url, description, author, fields, footer: shown as a quote). JSON, or a form's payload_json. 204, or the message with ?wait=true. Up to 30 posts a minute by default (platform data); never pings roles or @everyone. The token in the URL is the only credential.

Auth
None.

Path parameters

  • webhookId

    Webhook id (whk_…).

  • 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.

Query parameters

  • waitstring
curl -X POST 'https://api.cactive.com.au/v1/hooks/messaging/incoming/{webhookId}/{token}'
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: {
          name: string
          value: string
          inline: boolean
        }[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: {
          name: string
          id?: string
          animated?: boolean
        }
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object[]
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }
}

Response 204 with no body

POST/v1/hooks/messaging/incoming/:webhookId/:token/slack

Posts in the webhook's channel with Slack's payload: text (mrkdwn), blocks (header, section, context, divider, rich text) and attachments (as quotes), username. JSON, or a form's payload. Answers ok. Up to 30 posts a minute.

Auth
None.

Path parameters

  • webhookId

    Webhook id (whk_…).

  • 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 -X POST 'https://api.cactive.com.au/v1/hooks/messaging/incoming/{webhookId}/{token}/slack'
Send it from this page with your session or a key.
GET/v1/messaging/me

Your Mirage profile: name, status, custom status and the order of your servers; whether your account shows you are 18 or over (adult), and whether age-restricted channels show in the phone app (ageRestrictedOnPhone).

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  userId: string
  name: string
  status: "online" | "idle" | "dnd" | "invisible"
  customStatus: null | string
  serverOrder: string[]
  adult: boolean
  ageRestrictedOnPhone: boolean
}
PATCH/v1/messaging/me

Sets your status (online, idle, dnd, invisible), custom status or server order; your servers, friends and DM members hear the new status, and your other devices what you chose. ageRestrictedOnPhone shows age-restricted channels in the phone app: adults only, and never from the phone app itself (403).

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  userId: string
  name: string
  status: "online" | "idle" | "dnd" | "invisible"
  customStatus: null | string
  serverOrder: string[]
  adult: boolean
  ageRestrictedOnPhone: boolean
}
POST/v1/messaging/socket

A one-time ticket (a minute) and the socket URL: open <url>?ticket=<ticket> for live events from your servers. Send {"type":"ping"} within 10 minutes to keep it open, and {"type":"idle","idle":true} (or false) when nobody's using it: with every connection idle, an online person shows as idle.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/socket' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ticket: string
  url: null | string
  expiresIn: number
}
GET/v1/messaging/presence

Your friends' and DM members' presence (status: online, idle, dnd or offline, with their custom status); servers' member lists carry their members'.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/presence' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  presence: {
    at: number
    status: "offline" | "online" | "idle" | "dnd"
    customStatus?: string
    userId: string
  }[]
}
GET/v1/messaging/read-states

Where you've read up to in each channel, and unread mentions.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/read-states' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  readStates: {
    channelId: string
    serverId: string
    lastReadId: string
    mentions: number
    notify: "default" | "none" | "all" | "mentions"
    muted: boolean
    mutedUntil: null | number
  }[]
}
GET/v1/messaging/servers

Your servers in your order, each with whether it has unread messages and your unread mentions there.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  servers: {
    unread: boolean
    mentions: number
    notify: "none" | "all" | "mentions"
    serverId: string
    name: string
    icon: null | string
    description: null | string
    ownerId: string
    systemChannelId: null | string
    memberCount: number
    leaderboards: boolean
    createdAt: number
    banner: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    tag: null | string
    tagBadge: null | string
    verification: "none" | "low" | "medium" | "high"
    defaultNotify: "all" | "mentions"
    joinMessages: boolean
    rulesChannelId: null | string
    reportsChannelId: null | string
    community: boolean
    welcome: unknown
    onboarding: unknown
    optInChannelIds: string[]
    webPage: boolean
    invitesPausedUntil: null | number
    dmsPausedUntil: null | number
    afkChannelId: null | string
    afkTimeout: number
  }[]
}
POST/v1/messaging/servers

Creates a server you own (name, optional icon emoji, description, template), with @everyone, #general and a General voice channel. Servers belong to people, never to an organisation.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    ownerId: string
    systemChannelId: null | string
    memberCount: number
    leaderboards: boolean
    createdAt: number
    banner: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    tag: null | string
    tagBadge: null | string
    verification: "none" | "low" | "medium" | "high"
    defaultNotify: "all" | "mentions"
    joinMessages: boolean
    rulesChannelId: null | string
    reportsChannelId: null | string
    community: boolean
    welcome: unknown
    onboarding: unknown
    optInChannelIds: string[]
    webPage: boolean
    invitesPausedUntil: null | number
    dmsPausedUntil: null | number
    afkChannelId: null | string
    afkTimeout: number
  }
  channels: {
    bitrate?: number
    audio?: "voice" | "music" | "stereo"
    videoQuality?: "auto" | "full"
    rtcRegion?: null | string
    channelId: string
    serverId: string
    type: "text" | "voice" | "category" | "announcement" | "forum" | "stage"
    name: string
    topic: null | string
    parentId: null | string
    position: number
    nsfw: boolean
    slowmode: number
    userLimit: number
    overwrites: {
      id: string
      type: "role" | "member"
      allow: string
      deny: string
    }[]
    lastMessageId: null | string
  }[]
  roles: {
    roleId: string
    name: string
    color: null | string
    permissions: string
    position: number
    hoist: boolean
    mentionable: boolean
  }[]
  member: {
    nick: null | string
    roleIds: string[]
    joinedAt: number
    timeoutUntil: null | number
    mute: boolean
    deaf: boolean
    status: string
    customStatus: null | string
    bot: null | "platform" | "server" | "bot"
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    userId: string
    name: string
  }
  settings: {
    notify: "none" | "all" | "mentions"
    muted: boolean
    mutedUntil: null | number
    suppressEveryone: boolean
    suppressRoles: boolean
    allowDms: boolean
    wearTag: boolean
    hideMutedChannels: boolean
    onboarded: boolean
    onboardingAnswers: null | number[][]
    showAllChannels: boolean
    hiddenChannelIds: string[]
    optedInChannelIds: string[]
  }
  permissions: string
  permissionNames: ("CREATE_INVITE" | "KICK_MEMBERS" | "BAN_MEMBERS" | "ADMINISTRATOR" | "MANAGE_CHANNELS" | "MANAGE_SERVER" | "ADD_REACTIONS" | "VIEW_AUDIT_LOG" | "PRIORITY_SPEAKER" | "STREAM" | "VIEW_CHANNEL" | "SEND_MESSAGES" | "MANAGE_MESSAGES" | "EMBED_LINKS" | "ATTACH_FILES" | "READ_MESSAGE_HISTORY" | "MENTION_EVERYONE" | "USE_EXTERNAL_EMOJI" | "CONNECT" | "SPEAK" | "MUTE_MEMBERS" | "DEAFEN_MEMBERS" | "MOVE_MEMBERS" | "CHANGE_NICKNAME" | "MANAGE_NICKNAMES" | "MANAGE_ROLES" | "MANAGE_WEBHOOKS" | "MANAGE_EMOJIS" | "REQUEST_TO_SPEAK" | "MANAGE_EVENTS" | "MANAGE_THREADS" | "CREATE_THREADS" | "USE_EXTERNAL_STICKERS" | "SEND_IN_THREADS" | "MODERATE_MEMBERS" | "USE_SOUNDBOARD" | "USE_EXTERNAL_SOUNDS" | "SEND_POLLS" | "USE_EXTERNAL_APPS")[]
}
GET/v1/messaging/servers/discover

Retired with organisation links: always { servers: [] }, for apps from before. Servers are joined with an invite.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/discover' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  servers: []
}
GET/v1/messaging/me/linkable-orgs

Retired with organisation links: always { orgs: [] }, for apps from before.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/me/linkable-orgs' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  orgs: []
}
PUT/v1/messaging/servers/:serverId/org

Retired with organisation links: 410. Mirage is a space of its own, apart from organisations and Personal.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

curl -X PUT 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/org' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.
PATCH/v1/messaging/servers/:serverId/org

Retired with organisation links: 410.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/org' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.
DELETE/v1/messaging/servers/:serverId/org

Retired with organisation links: 410. Links left from before are removed by the separation script.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/org' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.
POST/v1/messaging/servers/:serverId/join

Retired with organisation links: 410. Join with an invite (POST /v1/messaging/invites/:code).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/join' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.
GET/v1/messaging/servers/:serverId

A server: its channels you can see, roles, your membership and your server permissions.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    ownerId: string
    systemChannelId: null | string
    memberCount: number
    leaderboards: boolean
    createdAt: number
    banner: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    tag: null | string
    tagBadge: null | string
    verification: "none" | "low" | "medium" | "high"
    defaultNotify: "all" | "mentions"
    joinMessages: boolean
    rulesChannelId: null | string
    reportsChannelId: null | string
    community: boolean
    welcome: unknown
    onboarding: unknown
    optInChannelIds: string[]
    webPage: boolean
    invitesPausedUntil: null | number
    dmsPausedUntil: null | number
    afkChannelId: null | string
    afkTimeout: number
  }
  channels: {
    bitrate?: number
    audio?: "voice" | "music" | "stereo"
    videoQuality?: "auto" | "full"
    rtcRegion?: null | string
    channelId: string
    serverId: string
    type: "text" | "voice" | "category" | "announcement" | "forum" | "stage"
    name: string
    topic: null | string
    parentId: null | string
    position: number
    nsfw: boolean
    slowmode: number
    userLimit: number
    overwrites: {
      id: string
      type: "role" | "member"
      allow: string
      deny: string
    }[]
    lastMessageId: null | string
  }[]
  roles: {
    roleId: string
    name: string
    color: null | string
    permissions: string
    position: number
    hoist: boolean
    mentionable: boolean
  }[]
  member: {
    nick: null | string
    roleIds: string[]
    joinedAt: number
    timeoutUntil: null | number
    mute: boolean
    deaf: boolean
    status: string
    customStatus: null | string
    bot: null | "platform" | "server" | "bot"
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    userId: string
    name: string
  }
  settings: {
    notify: "none" | "all" | "mentions"
    muted: boolean
    mutedUntil: null | number
    suppressEveryone: boolean
    suppressRoles: boolean
    allowDms: boolean
    wearTag: boolean
    hideMutedChannels: boolean
    onboarded: boolean
    onboardingAnswers: null | number[][]
    showAllChannels: boolean
    hiddenChannelIds: string[]
    optedInChannelIds: string[]
  }
  permissions: string
  permissionNames: ("CREATE_INVITE" | "KICK_MEMBERS" | "BAN_MEMBERS" | "ADMINISTRATOR" | "MANAGE_CHANNELS" | "MANAGE_SERVER" | "ADD_REACTIONS" | "VIEW_AUDIT_LOG" | "PRIORITY_SPEAKER" | "STREAM" | "VIEW_CHANNEL" | "SEND_MESSAGES" | "MANAGE_MESSAGES" | "EMBED_LINKS" | "ATTACH_FILES" | "READ_MESSAGE_HISTORY" | "MENTION_EVERYONE" | "USE_EXTERNAL_EMOJI" | "CONNECT" | "SPEAK" | "MUTE_MEMBERS" | "DEAFEN_MEMBERS" | "MOVE_MEMBERS" | "CHANGE_NICKNAME" | "MANAGE_NICKNAMES" | "MANAGE_ROLES" | "MANAGE_WEBHOOKS" | "MANAGE_EMOJIS" | "REQUEST_TO_SPEAK" | "MANAGE_EVENTS" | "MANAGE_THREADS" | "CREATE_THREADS" | "USE_EXTERNAL_STICKERS" | "SEND_IN_THREADS" | "MODERATE_MEMBERS" | "USE_SOUNDBOARD" | "USE_EXTERNAL_SOUNDS" | "SEND_POLLS" | "USE_EXTERNAL_APPS")[]
}
PATCH/v1/messaging/servers/:serverId

Renames a server or changes its icon, description or system channel (MANAGE_SERVER).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    ownerId: string
    systemChannelId: null | string
    memberCount: number
    leaderboards: boolean
    createdAt: number
    banner: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    tag: null | string
    tagBadge: null | string
    verification: "none" | "low" | "medium" | "high"
    defaultNotify: "all" | "mentions"
    joinMessages: boolean
    rulesChannelId: null | string
    reportsChannelId: null | string
    community: boolean
    welcome: unknown
    onboarding: unknown
    optInChannelIds: string[]
    webPage: boolean
    invitesPausedUntil: null | number
    dmsPausedUntil: null | number
    afkChannelId: null | string
    afkTimeout: number
  }
}
DELETE/v1/messaging/servers/:serverId

Deletes a server and everything in it. Owner only.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/servers/:serverId/leave

Leaves a server (the owner transfers it or deletes it instead).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leave' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/servers/:serverId/transfer

Hands the server to another member (userId, never a bot); recorded in the audit log. Owner only.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/transfer' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    ownerId: string
    systemChannelId: null | string
    memberCount: number
    leaderboards: boolean
    createdAt: number
    banner: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    tag: null | string
    tagBadge: null | string
    verification: "none" | "low" | "medium" | "high"
    defaultNotify: "all" | "mentions"
    joinMessages: boolean
    rulesChannelId: null | string
    reportsChannelId: null | string
    community: boolean
    welcome: unknown
    onboarding: unknown
    optInChannelIds: string[]
    webPage: boolean
    invitesPausedUntil: null | number
    dmsPausedUntil: null | number
    afkChannelId: null | string
    afkTimeout: number
  }
}
POST/v1/messaging/servers/:serverId/channels

Creates a channel or category (type, name, parentId, topic, slowmode, nsfw, userLimit, overwrites; voice channels also bitrate 8 to 96 kbps, audio voice, music or stereo, videoQuality auto or full, rtcRegion). MANAGE_CHANNELS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/channels' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  channel: {
    bitrate?: number
    audio?: "voice" | "music" | "stereo"
    videoQuality?: "auto" | "full"
    rtcRegion?: null | string
    channelId: string
    serverId: string
    type: "text" | "voice" | "category" | "announcement" | "forum" | "stage"
    name: string
    topic: null | string
    parentId: null | string
    position: number
    nsfw: boolean
    slowmode: number
    userLimit: number
    overwrites: {
      id: string
      type: "role" | "member"
      allow: string
      deny: string
    }[]
    lastMessageId: null | string
  }
}
PATCH/v1/messaging/servers/:serverId/channels

Reorders channels and moves them between categories: [{ id, position, parentId }]. MANAGE_CHANNELS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/channels' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  channels: {
    bitrate?: number
    audio?: "voice" | "music" | "stereo"
    videoQuality?: "auto" | "full"
    rtcRegion?: null | string
    channelId: string
    serverId: string
    type: "text" | "voice" | "category" | "announcement" | "forum" | "stage"
    name: string
    topic: null | string
    parentId: null | string
    position: number
    nsfw: boolean
    slowmode: number
    userLimit: number
    overwrites: {
      id: string
      type: "role" | "member"
      allow: string
      deny: string
    }[]
    lastMessageId: null | string
  }[]
}
PATCH/v1/messaging/servers/:serverId/channels/:channelId

Changes a channel's name, topic, category, slow mode, NSFW, user limit, position (MANAGE_CHANNELS there) or permission overwrites (MANAGE_ROLES there; only permissions you have, server-wide or there; one overwrite per role or member); a voice channel's bitrate, audio, video quality or region override (rtcRegion, a location id; null for automatic). Fields sent unchanged need nothing. New overwrites apply to people connected at once, and a category's reach its synced channels.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/channels/{channelId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  channel: {
    bitrate?: number
    audio?: "voice" | "music" | "stereo"
    videoQuality?: "auto" | "full"
    rtcRegion?: null | string
    channelId: string
    serverId: string
    type: "text" | "voice" | "category" | "announcement" | "forum" | "stage"
    name: string
    topic: null | string
    parentId: null | string
    position: number
    nsfw: boolean
    slowmode: number
    userLimit: number
    overwrites: {
      id: string
      type: "role" | "member"
      allow: string
      deny: string
    }[]
    lastMessageId: null | string
  }
}
DELETE/v1/messaging/servers/:serverId/channels/:channelId

Deletes a channel and its messages (a category's channels stay, uncategorised). MANAGE_CHANNELS in the channel.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/channels/{channelId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/servers/:serverId/roles

Creates a role just above @everyone (name, color, permissions, hoist, mentionable); you can only grant permissions you have. MANAGE_ROLES.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/roles' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  role: {
    roleId: string
    name: string
    color: null | string
    permissions: string
    position: number
    hoist: boolean
    mentionable: boolean
  }
}
PATCH/v1/messaging/servers/:serverId/roles

Reorders roles below your highest role: [{ roleId, position }].

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/roles' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  roles: {
    roleId: string
    name: string
    color: null | string
    permissions: string
    position: number
    hoist: boolean
    mentionable: boolean
  }[]
}
PATCH/v1/messaging/servers/:serverId/roles/:roleId

Changes a role below your highest role.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • roleId

    A built-in role (owner, admin, developer, viewer) or a custom role id (rol_…); in Mirage, a server role (mrl_…, or the server's id for @everyone).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/roles/{roleId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  role: {
    roleId: string
    name: string
    color: null | string
    permissions: string
    position: number
    hoist: boolean
    mentionable: boolean
  }
}
DELETE/v1/messaging/servers/:serverId/roles/:roleId

Deletes a role below your highest role; members lose it and channels drop its overwrites.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • roleId

    A built-in role (owner, admin, developer, viewer) or a custom role id (rol_…); in Mirage, a server role (mrl_…, or the server's id for @everyone).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/roles/{roleId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/servers/:serverId/icon/uploads

Where to PUT a new server icon (mime: PNG, JPEG, WebP or GIF; size up to 2 MB); then save the server with the icon it answers (image:<version>). MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/icon/uploads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  icon: string
  url: string
  headers: {
    "content-type": string
  }
}
GET/v1/messaging/servers/:serverId/automod/rules

A server's AutoMod rules. MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/automod/rules' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  rules: {
    ruleId: string
    name: string
    trigger: "links" | "mentions" | "keyword" | "invites"
    enabled: boolean
    keywords: string[]
    allow: string[]
    limit: number
    block: boolean
    blockMessage: null | string
    alertChannelId: null | string
    timeoutMinutes: number
    exemptRoles: string[]
    exemptChannels: string[]
  }[]
}
POST/v1/messaging/servers/:serverId/automod/rules

Adds an AutoMod rule (up to 20): trigger (keyword with keywords and an allow list, invites to other servers, mentions or links over a limit), what it does (block with an optional blockMessage, alertChannelId, timeoutMinutes), and exemptRoles and exemptChannels. Keywords: word whole words, word* starting, *word ending, *word* anywhere. The owner, Administrator, Manage Server and bots aren't checked. MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/automod/rules' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  rule: {
    ruleId: string
    name: string
    trigger: "links" | "mentions" | "keyword" | "invites"
    enabled: boolean
    keywords: string[]
    allow: string[]
    limit: number
    block: boolean
    blockMessage: null | string
    alertChannelId: null | string
    timeoutMinutes: number
    exemptRoles: string[]
    exemptChannels: string[]
  }
}
PATCH/v1/messaging/servers/:serverId/automod/rules/:ruleId

Changes an AutoMod rule (or turns it off with enabled: false). MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • ruleId

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/automod/rules/{ruleId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  rule: {
    ruleId: string
    name: string
    trigger: "links" | "mentions" | "keyword" | "invites"
    enabled: boolean
    keywords: string[]
    allow: string[]
    limit: number
    block: boolean
    blockMessage: null | string
    alertChannelId: null | string
    timeoutMinutes: number
    exemptRoles: string[]
    exemptChannels: string[]
  }
}
DELETE/v1/messaging/servers/:serverId/automod/rules/:ruleId

Deletes an AutoMod rule. MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • ruleId

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/automod/rules/{ruleId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/servers/:serverId/events

A server's upcoming and live events (and ones that ended in the last day) you can see, soonest first, with whether you're interested.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/events' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  events: {
    eventId: string
    serverId: string
    name: string
    description: null | string
    startAt: number
    endAt: null | number
    channelId: null | string
    place: null | string
    creatorId: string
    status: "canceled" | "live" | "upcoming" | "over"
    interestedCount: number
    goingCount: number
    interested: boolean
  }[]
}
POST/v1/messaging/servers/:serverId/events

Schedules an event: name, startAt (ms), in a voice channel (channelId) or somewhere else (place, with endAt), optional description. MANAGE_EVENTS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/events' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  event: {
    eventId: string
    serverId: string
    name: string
    description: null | string
    startAt: number
    endAt: null | number
    channelId: null | string
    place: null | string
    creatorId: string
    status: "canceled" | "live" | "upcoming" | "over"
    interestedCount: number
    goingCount: number
    interested: boolean
  }
}
PATCH/v1/messaging/servers/:serverId/events/:eventId

Changes an event's name, description or times, ends it now (end: true) or cancels it (cancel: true). MANAGE_EVENTS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • eventId

    Event id: a calendar event (evt_…; a recurring event's occurrences share it), or a Mirage server's event (mev_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/events/{eventId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  event: {
    eventId: string
    serverId: string
    name: string
    description: null | string
    startAt: number
    endAt: null | number
    channelId: null | string
    place: null | string
    creatorId: string
    status: "canceled" | "live" | "upcoming" | "over"
    interestedCount: number
    goingCount: number
    interested: boolean
  }
}
DELETE/v1/messaging/servers/:serverId/events/:eventId

Deletes an event. MANAGE_EVENTS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • eventId

    Event id: a calendar event (evt_…; a recurring event's occurrences share it), or a Mirage server's event (mev_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/events/{eventId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

PUT/v1/messaging/servers/:serverId/events/:eventId/interested

Marks you interested in an event.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • eventId

    Event id: a calendar event (evt_…; a recurring event's occurrences share it), or a Mirage server's event (mev_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/events/{eventId}/interested' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  event: {
    eventId: string
    serverId: string
    name: string
    description: null | string
    startAt: number
    endAt: null | number
    channelId: null | string
    place: null | string
    creatorId: string
    status: "canceled" | "live" | "upcoming" | "over"
    interestedCount: number
    goingCount: number
    interested: boolean
  }
}
DELETE/v1/messaging/servers/:serverId/events/:eventId/interested

Takes your interest back.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • eventId

    Event id: a calendar event (evt_…; a recurring event's occurrences share it), or a Mirage server's event (mev_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/events/{eventId}/interested' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  event: {
    eventId: string
    serverId: string
    name: string
    description: null | string
    startAt: number
    endAt: null | number
    channelId: null | string
    place: null | string
    creatorId: string
    status: "canceled" | "live" | "upcoming" | "over"
    interestedCount: number
    goingCount: number
    interested: boolean
  }
}
GET/v1/messaging/servers/:serverId/events/:eventId/interested

Who's interested (first 100).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • eventId

    Event id: a calendar event (evt_…; a recurring event's occurrences share it), or a Mirage server's event (mev_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/events/{eventId}/interested' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  users: {
    userId: string
    name: string
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    bot?: "platform" | "server" | "bot"
    external?: "discord" | "webhook"
  }[]
}
GET/v1/messaging/emojis

Every emoji of your servers, by server (its name, icon and emoji): what a story's emoji stickers pick from.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/emojis' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  servers: {
    serverId: string
    serverName: string
    icon: null | string
    emojis: {
      emojiId: string
      name: string
      animated: boolean
    }[]
  }[]
}
GET/v1/messaging/servers/:serverId/emojis

A server's own emoji (name, animated, who added it) and its limits (platform data; by default 100 still and 100 animated, 256 KB each).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/emojis' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  emojis: {
    emojiId: string
    name: string
    animated: boolean
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }[]
  limits: {
    still: number
    animated: number
    bytes: number
  }
}
POST/v1/messaging/servers/:serverId/emojis/uploads

Where to PUT an emoji image (name, mime: PNG, JPEG, GIF, WebP or AVIF, size) before adding it. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/emojis/uploads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  emojiId: string
  url: string
  headers: {
    "content-type": "image/png" | "image/jpeg" | "image/webp" | "image/gif" | "image/avif"
  }
}
POST/v1/messaging/servers/:serverId/emojis

Adds an uploaded emoji (emojiId from the upload, name: 2–32 letters, numbers and underscores, unique in the server). GIFs are animated. Use it as <:name:id> in messages and name:id as a reaction. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/emojis' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  emoji: {
    emojiId: string
    name: string
    animated: boolean
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }
}
PATCH/v1/messaging/servers/:serverId/emojis/:emojiId

Renames an emoji. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • emojiId

    Mirage emoji id (mem_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/emojis/{emojiId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  emoji: {
    emojiId: string
    name: string
    animated: boolean
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }
}
DELETE/v1/messaging/servers/:serverId/emojis/:emojiId

Deletes an emoji. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • emojiId

    Mirage emoji id (mem_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/emojis/{emojiId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/stickers

Every sticker you can pick, by server (each of your servers with stickers: its name, icon and stickers). Another server's need USE_EXTERNAL_STICKERS where you send them.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/stickers' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  servers: {
    serverId: string
    serverName: string
    icon: null | string
    stickers: {
      stickerId: string
      serverId: string
      name: string
      description: null | string
      tags: null | string
      format: "gif" | "png" | "webp" | "apng"
      creator: {
        userId: string
        name: string
      }
      createdAt: number
    }[]
  }[]
}
GET/v1/messaging/servers/:serverId/stickers

A server's stickers (name, description, related emoji as tags, format, who added it) and its limits (platform data; by default 60 stickers, 512 KB each).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/stickers' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  stickers: {
    stickerId: string
    serverId: string
    name: string
    description: null | string
    tags: null | string
    format: "gif" | "png" | "webp" | "apng"
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }[]
  limits: {
    count: number
    bytes: number
  }
}
POST/v1/messaging/servers/:serverId/stickers/uploads

Where to PUT a sticker image (mime: PNG, APNG, GIF or WebP; size) before adding it; the answer names its stickerId. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/stickers/uploads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  stickerId: string
  url: string
  headers: {
    "content-type": "image/png" | "image/webp" | "image/gif" | "image/apng"
  }
}
POST/v1/messaging/servers/:serverId/stickers

Adds an uploaded sticker (stickerId, mime, name 2 to 30 characters, optional description and tags: the emoji it's like). Send it with a message's stickerIds (up to 3). MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/stickers' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  sticker: {
    stickerId: string
    serverId: string
    name: string
    description: null | string
    tags: null | string
    format: "gif" | "png" | "webp" | "apng"
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }
}
PATCH/v1/messaging/servers/:serverId/stickers/:stickerId

Changes a sticker's name, description or tags (null clears). MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • stickerId

    Mirage sticker id (mst_…; Discord's from the bridge are dst_<id>).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/stickers/{stickerId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  sticker: {
    stickerId: string
    serverId: string
    name: string
    description: null | string
    tags: null | string
    format: "gif" | "png" | "webp" | "apng"
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }
}
DELETE/v1/messaging/servers/:serverId/stickers/:stickerId

Deletes a sticker. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • stickerId

    Mirage sticker id (mst_…; Discord's from the bridge are dst_<id>).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/stickers/{stickerId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/sounds

Every soundboard sound you can play, by server (each of your servers with sounds). Another server's need USE_EXTERNAL_SOUNDS where you play them.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/sounds' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  servers: {
    serverId: string
    serverName: string
    icon: null | string
    sounds: {
      soundId: string
      serverId: string
      name: string
      emoji: null | string
      volume: number
      durationMs: number
      creator: {
        userId: string
        name: string
      }
      createdAt: number
    }[]
  }[]
}
GET/v1/messaging/servers/:serverId/sounds

A server's soundboard (name, emoji, volume, length, who added it) and its limits (platform data; by default 48 sounds, 512 KB and 5.2 seconds each).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/sounds' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  sounds: {
    soundId: string
    serverId: string
    name: string
    emoji: null | string
    volume: number
    durationMs: number
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }[]
  limits: {
    count: number
    bytes: number
    seconds: number
  }
}
POST/v1/messaging/servers/:serverId/sounds/uploads

Where to PUT a sound (mime: MP3, Ogg, WAV, WebM or MP4 audio; size) before adding it; the answer names its soundId. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/sounds/uploads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  soundId: string
  url: string
  headers: {
    "content-type": "audio/mpeg" | "audio/ogg" | "audio/webm" | "audio/wav" | "audio/x-wav" | "audio/mp4"
  }
}
POST/v1/messaging/servers/:serverId/sounds

Adds an uploaded sound (soundId, mime, durationMs as measured, name 2 to 32 characters, optional emoji and volume 0 to 1). MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/sounds' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  sound: {
    soundId: string
    serverId: string
    name: string
    emoji: null | string
    volume: number
    durationMs: number
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }
}
PATCH/v1/messaging/servers/:serverId/sounds/:soundId

Changes a sound's name, emoji or volume. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • soundId

    Mirage soundboard sound id (msd_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/sounds/{soundId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  sound: {
    soundId: string
    serverId: string
    name: string
    emoji: null | string
    volume: number
    durationMs: number
    creator: {
      userId: string
      name: string
    }
    createdAt: number
  }
}
DELETE/v1/messaging/servers/:serverId/sounds/:soundId

Deletes a sound. MANAGE_EMOJIS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • soundId

    Mirage soundboard sound id (msd_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/sounds/{soundId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/channels/:channelId/soundboard

Plays a sound (soundId) for everyone connected to the voice or stage channel: they get a soundboard event and their apps play it. You must be connected there, able to speak and not deafened; USE_SOUNDBOARD (and USE_EXTERNAL_SOUNDS for another server's). Up to 12 a minute.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/soundboard' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  played: boolean
}
GET/v1/messaging/servers/:serverId/members

The server's members with nicknames, roles and presence (q filters by name).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Query parameters

  • qstring

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/members' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  members: {
    nick: null | string
    roleIds: string[]
    joinedAt: number
    timeoutUntil: null | number
    mute: boolean
    deaf: boolean
    status: string
    customStatus: null | string
    bot: null | "platform" | "server" | "bot"
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    userId: string
    name: string
  }[]
}
POST/v1/messaging/servers/:serverId/members/bulk

One action for up to 100 members: kick, ban (reason), timeout (until, ms, or null to remove), add_role or remove_role (roleId). Each goes through the usual permission and hierarchy checks; returns who it was done to and who failed and why.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/members/bulk' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  done: string[]
  failed: {
    userId: string
    error: string
  }[]
}
PATCH/v1/messaging/servers/:serverId/members/me

Your settings in a server: nickname (CHANGE_NICKNAME), notifications (notify: all, mentions, none; muted with muteMinutes; suppressEveryone, suppressRoles), privacy (allowDms from its members), whether you wear its tag, hiding muted channels, and your channel list (Browse Channels: showAllChannels, and channels switched on or off as { channelId, listed }, a category's id for all its channels; only channels you can see).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/members/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  member: null | {
    nick: null | string
    roleIds: string[]
    joinedAt: number
    timeoutUntil: null | number
    mute: boolean
    deaf: boolean
    status: string
    customStatus: null | string
    bot: null | "platform" | "server" | "bot"
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    userId: string
    name: string
  }
  settings: {
    notify: "none" | "all" | "mentions"
    muted: boolean
    mutedUntil: null | number
    suppressEveryone: boolean
    suppressRoles: boolean
    allowDms: boolean
    wearTag: boolean
    hideMutedChannels: boolean
    onboarded: boolean
    onboardingAnswers: null | number[][]
    showAllChannels: boolean
    hiddenChannelIds: string[]
    optedInChannelIds: string[]
  }
}
POST/v1/messaging/servers/:serverId/onboarding

Answers the server's onboarding questions (answers: option indexes per question), at joining or again later (Channels & Roles): the chosen options' roles are granted (answering again takes back roles of options no longer chosen) and their channels added to your channel list. Returns your roles and settings.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/onboarding' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  roleIds: string[]
  settings: {
    notify: "none" | "all" | "mentions"
    muted: boolean
    mutedUntil: null | number
    suppressEveryone: boolean
    suppressRoles: boolean
    allowDms: boolean
    wearTag: boolean
    hideMutedChannels: boolean
    onboarded: boolean
    onboardingAnswers: null | number[][]
    showAllChannels: boolean
    hiddenChannelIds: string[]
    optedInChannelIds: string[]
  }
}
GET/v1/messaging/servers/:serverId/insights

Membership and activity: members, online now, joins per day over 30 days, messages and people per channel over 7 days, members per role. MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/insights' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  members: number
  online: number
  joinedLast7: number
  joinedLast30: number
  joins: {
    day: string
    count: number
  }[]
  channels: {
    channelId: string
    name: string
    messages: number
    people: number
  }[]
  roles: {
    roleId: string
    name: string
    color: null | string
    members: number
  }[]
}
GET/v1/messaging/servers/:serverId/template

The server's template, if it has one: its link, name, uses and size. MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/template' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  template: null | {
    code: string
    url: string
    name: string
    description: null | string
    uses: number
    updatedAt: number
    channels: number
    roles: number
  }
}
POST/v1/messaging/servers/:serverId/template

Makes (or replaces) the server's template from its current channels, roles, permission overwrites and settings. Messages and members are never included. MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/template' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  template: {
    code: string
    url: string
    name: string
    description: null | string
    uses: number
    updatedAt: number
    channels: number
    roles: number
  }
}
PUT/v1/messaging/servers/:serverId/template

Brings the template up to date with the server's current channels and roles.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/template' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  template: {
    code: string
    url: string
    name: string
    description: null | string
    uses: number
    updatedAt: number
    channels: number
    roles: number
  }
}
DELETE/v1/messaging/servers/:serverId/template

Deletes the server's template; its link stops working.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/template' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/templates/:code

What a template link holds: name, description, categories with their channels, and roles.

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

Path parameters

  • code

    Mirage invite code (8 letters and digits); under me/food a household invitation's code (from its link).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/templates/{code}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  template: {
    categories: {
      name: string
      channels: {
        type: string
        name: string
      }[]
    }[]
    roleNames: string[]
    code: string
    url: string
    name: string
    description: null | string
    uses: number
    updatedAt: number
    channels: number
    roles: number
  }
}
POST/v1/messaging/templates/:code

Creates a server you own from a template (name, optional icon).

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

Path parameters

  • code

    Mirage invite code (8 letters and digits); under me/food a household invitation's code (from its link).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/templates/{code}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    ownerId: string
    systemChannelId: null | string
    memberCount: number
    leaderboards: boolean
    createdAt: number
    banner: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    tag: null | string
    tagBadge: null | string
    verification: "none" | "low" | "medium" | "high"
    defaultNotify: "all" | "mentions"
    joinMessages: boolean
    rulesChannelId: null | string
    reportsChannelId: null | string
    community: boolean
    welcome: unknown
    onboarding: unknown
    optInChannelIds: string[]
    webPage: boolean
    invitesPausedUntil: null | number
    dmsPausedUntil: null | number
    afkChannelId: null | string
    afkTimeout: number
  }
}
POST/v1/messaging/servers/:serverId/security

Security actions: pause new joins through invites (invitesPausedHours) or DMs between members who aren't friends (dmsPausedHours) for up to 24 hours; 0 resumes. MANAGE_SERVER.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/security' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    ownerId: string
    systemChannelId: null | string
    memberCount: number
    leaderboards: boolean
    createdAt: number
    banner: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    tag: null | string
    tagBadge: null | string
    verification: "none" | "low" | "medium" | "high"
    defaultNotify: "all" | "mentions"
    joinMessages: boolean
    rulesChannelId: null | string
    reportsChannelId: null | string
    community: boolean
    welcome: unknown
    onboarding: unknown
    optInChannelIds: string[]
    webPage: boolean
    invitesPausedUntil: null | number
    dmsPausedUntil: null | number
    afkChannelId: null | string
    afkTimeout: number
  }
}
GET/v1/messaging/servers/:serverId/audit-log

The audit log, newest first (45 days): who changed the server, its channels, roles, members, invites and settings. Filters action, userId; before pages. VIEW_AUDIT_LOG.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Query parameters

  • beforestring
  • actionstring
  • userIdstring
  • limitstring

    Default 50.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/audit-log' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  entries: {
    auditId: string
    action: string
    actor: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }
    targetType: null | string
    targetId: null | string
    target: null | string
    changes: unknown
    reason: null | string
    createdAt: number
  }[]
  hasMore: boolean
}
PATCH/v1/messaging/servers/:serverId/members/:userId

A member's nickname, roles, timeout (timeoutUntil, up to 28 days) or voice mute and deafen, by permission and hierarchy.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/members/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  member: null | {
    nick: null | string
    roleIds: string[]
    joinedAt: number
    timeoutUntil: null | number
    mute: boolean
    deaf: boolean
    status: string
    customStatus: null | string
    bot: null | "platform" | "server" | "bot"
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    userId: string
    name: string
  }
}
DELETE/v1/messaging/servers/:serverId/members/:userId

Kicks a member below you (KICK_MEMBERS).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/members/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/servers/:serverId/bans

Banned people and why (BAN_MEMBERS).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/bans' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  bans: {
    user: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }
    reason: null | string
    at: number
  }[]
}
PUT/v1/messaging/servers/:serverId/bans/:userId

Bans someone (reason optional): they're removed and can't rejoin.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/bans/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

DELETE/v1/messaging/servers/:serverId/bans/:userId

Lifts a ban.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/bans/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/servers/:serverId/invites

The server's working invites (not expired or used up), newest first, with who made each (inviter) and their uses (MANAGE_SERVER).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/invites' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  invites: {
    code: string
    url: string
    channelId: string
    createdBy: string
    inviter: null | {
      userId: string
      name: string
      avatarUrl: null | string
    }
    uses: number
    maxUses: number
    expiresAt: null | number
    createdAt: number
  }[]
}
POST/v1/messaging/servers/:serverId/invites

Creates an invite (channelId, maxUses up to 100, maxAgeSeconds up to 7 days; 0 never expires). CREATE_INVITE.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/invites' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  code: string
  url: string
  channelId: string
  maxUses: number
  expiresAt: null | number
}
GET/v1/messaging/channels/:channelId/invites

One channel's working invites, as the server's list gives them (MANAGE_CHANNELS in the channel).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/invites' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  invites: {
    code: string
    url: string
    channelId: string
    createdBy: string
    inviter: null | {
      userId: string
      name: string
      avatarUrl: null | string
    }
    uses: number
    maxUses: number
    expiresAt: null | number
    createdAt: number
  }[]
}
GET/v1/messaging/invites/:code

What an invite opens: the server's name, icon, description, member and online counts, and whether you're in it already. Limited per person a minute.

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

Path parameters

  • code

    Mirage invite code (8 letters and digits); under me/food a household invitation's code (from its link).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/invites/{code}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  code: string
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    memberCount: number
    onlineCount: number
  }
  channel: {
    channelId: string
    name: null | string
  }
  member?: boolean
}
POST/v1/messaging/invites/:code

Joins the invite's server (bans apply).

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

Path parameters

  • code

    Mirage invite code (8 letters and digits); under me/food a household invitation's code (from its link).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/invites/{code}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  server: {
    serverId: string
    name: string
    icon: null | string
    description: null | string
    ownerId: string
    systemChannelId: null | string
    memberCount: number
    leaderboards: boolean
    createdAt: number
    banner: null | string
    traits: {
      label: string
      emoji?: string
    }[]
    tag: null | string
    tagBadge: null | string
    verification: "none" | "low" | "medium" | "high"
    defaultNotify: "all" | "mentions"
    joinMessages: boolean
    rulesChannelId: null | string
    reportsChannelId: null | string
    community: boolean
    welcome: unknown
    onboarding: unknown
    optInChannelIds: string[]
    webPage: boolean
    invitesPausedUntil: null | number
    dmsPausedUntil: null | number
    afkChannelId: null | string
    afkTimeout: number
  }
  channelId: string
  joined: boolean
}
DELETE/v1/messaging/invites/:code

Revokes an invite (its creator, MANAGE_SERVER, or MANAGE_CHANNELS in its channel).

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

Path parameters

  • code

    Mirage invite code (8 letters and digits); under me/food a household invitation's code (from its link).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/invites/{code}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/channels/:channelId/messages

A page of messages, oldest first: the newest by default, before or after a message id, or around one (jumping to it), limit up to 100. hasMoreBefore and hasMoreAfter say whether there's more either side.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Query parameters

  • beforestring
  • afterstring
  • aroundstring
  • limitstring

    Default 50.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  messages: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: object[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: object
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }[]
  hasMore: boolean
  hasMoreBefore: boolean
  hasMoreAfter: boolean
}
POST/v1/messaging/channels/:channelId/messages

Sends a message (content up to 4,000 characters, replyTo, attachments uploaded first, nonce to send once). Mentions: <@usr_…>, <@&role>, @everyone/@here (MENTION_EVERYONE).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  message: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: {
          name: string
          value: string
          inline: boolean
        }[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: {
          name: string
          id?: string
          animated?: boolean
        }
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object[]
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }
}
GET/v1/messaging/channels/:channelId/messages/:messageId

One message.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: {
          name: string
          value: string
          inline: boolean
        }[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: {
          name: string
          id?: string
          animated?: boolean
        }
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object[]
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }
}
PATCH/v1/messaging/channels/:channelId/messages/:messageId

Edits your own message (content).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: {
          name: string
          value: string
          inline: boolean
        }[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: {
          name: string
          id?: string
          animated?: boolean
        }
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object[]
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }
}
DELETE/v1/messaging/channels/:channelId/messages/:messageId

Deletes a message: your own, or anyone's with MANAGE_MESSAGES.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/channels/:channelId/pins

The channel's pinned messages, newest first (50 at most).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/pins' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  messages: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: object[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: object
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }[]
}
PUT/v1/messaging/channels/:channelId/pins/:messageId

Pins a message (MANAGE_MESSAGES).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/pins/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: {
          name: string
          value: string
          inline: boolean
        }[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: {
          name: string
          id?: string
          animated?: boolean
        }
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object[]
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }
}
DELETE/v1/messaging/channels/:channelId/pins/:messageId

Unpins a message.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/pins/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: {
          name: string
          value: string
          inline: boolean
        }[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: {
          name: string
          id?: string
          animated?: boolean
        }
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object[]
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }
}
PUT/v1/messaging/channels/:channelId/messages/:messageId/reactions/:emoji

Adds your reaction (a new emoji on the message needs ADD_REACTIONS; 20 different at most).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

  • emoji

    A Unicode emoji, URL-encoded.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/reactions/{emoji}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  emoji: string
  count: number
  me: boolean
}
DELETE/v1/messaging/channels/:channelId/messages/:messageId/reactions/:emoji

Removes your reaction.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

  • emoji

    A Unicode emoji, URL-encoded.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/reactions/{emoji}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  emoji: string
  count: number
  me: boolean
}
GET/v1/messaging/channels/:channelId/messages/:messageId/reactions/:emoji

Who reacted with an emoji.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

  • emoji

    A Unicode emoji, URL-encoded.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/reactions/{emoji}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  users: {
    userId: string
    name: string
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    bot?: "platform" | "server" | "bot"
    external?: "discord" | "webhook"
  }[]
}
PATCH/v1/messaging/channels/:channelId/settings

Your notifications for a channel, category or thread (notify: default follows the next place out: a thread its channel, a channel its category, a category the server; all, mentions or none) and its mute (muted, with muteMinutes for a while). A muted place (or one in a muted category) shows no unread mark and sends no pushes; none shows no mention count; all pushes every message to your phone.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/settings' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  channelId: string
  serverId: string
  lastReadId: string
  mentions: number
  notify: "default" | "none" | "all" | "mentions"
  muted: boolean
  mutedUntil: null | number
}
PUT/v1/messaging/channels/:channelId/messages/:messageId/poll/answers/:answerId

Votes for a poll's answer (with one answer each, it replaces your earlier vote). Polls are posted with poll (question, 2–10 answers, hours open, multiple) on a new message; SEND_POLLS.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

  • answerId

    A poll answer's id (1–10).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/poll/answers/{answerId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  poll: {
    question: string
    answers: {
      answerId: string
      text: string
      emoji: null | string
      count: number
    }[]
    multiple: boolean
    expiresAt: number
    closed: boolean
    total: number
    mine: string[]
  }
}
DELETE/v1/messaging/channels/:channelId/messages/:messageId/poll/answers/:answerId

Takes your vote for an answer back.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

  • answerId

    A poll answer's id (1–10).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/poll/answers/{answerId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  poll: {
    question: string
    answers: {
      answerId: string
      text: string
      emoji: null | string
      count: number
    }[]
    multiple: boolean
    expiresAt: number
    closed: boolean
    total: number
    mine: string[]
  }
}
GET/v1/messaging/channels/:channelId/messages/:messageId/poll/answers/:answerId/voters

Who chose an answer (first 100).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

  • answerId

    A poll answer's id (1–10).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/poll/answers/{answerId}/voters' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  users: {
    userId: string
    name: string
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    bot?: "platform" | "server" | "bot"
    external?: "discord" | "webhook"
  }[]
}
POST/v1/messaging/channels/:channelId/messages/:messageId/poll/end

Ends a poll early (its author, or MANAGE_MESSAGES).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/poll/end' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  poll: {
    question: string
    answers: {
      answerId: string
      text: string
      emoji: null | string
      count: number
    }[]
    multiple: boolean
    expiresAt: number
    closed: boolean
    total: number
    mine: string[]
  }
}
DELETE/v1/messaging/channels/:channelId/messages/:messageId/embeds

Removes a message's link previews for good (its author, or MANAGE_MESSAGES). Links are previewed after a message is sent or edited; <https://…> in angle brackets isn't.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/embeds' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: {
          name: string
          value: string
          inline: boolean
        }[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: {
          name: string
          id?: string
          animated?: boolean
        }
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object[]
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }
}
POST/v1/messaging/channels/:channelId/messages/:messageId/forward

Forwards a copy of a message (its text, files and link previews, as they are now, and where it came from; not its author) to up to five channels in to, with an optional note. Mentions in the copy don't notify; polls and system messages can't be forwarded; forwarding a forward sends the original copy on. Each channel's own rules apply (Send Messages, Attach Files for files, slow mode, AutoMod); results says what happened in each. Forwards to direct messages are made by the app (they're end to end). Needs READ_MESSAGE_HISTORY where it's from.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/forward' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  results: {
    channelId: string
    messageId?: string
    error?: string
  }[]
}
GET/v1/messaging/forward-targets

Where you can forward to: by server, the text and announcement channels you can post in.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/forward-targets' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  servers: {
    serverId: string
    name: string
    icon: null | string
    channels: {
      channelId: string
      name: string
      type: "text" | "voice" | "category" | "announcement" | "forum" | "stage"
      lastMessageId: null | string
    }[]
  }[]
}
POST/v1/messaging/channels/:channelId/messages/:messageId/publish

Publishes a post in an announcement channel to the channels following it: each gets a copy shown as this server and channel, with a link back. Edits and deletion of the post reach the copies; mentions in copies don't notify. Your own post (with SEND_MESSAGES), or anyone's with MANAGE_MESSAGES; once per post.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/messages/{messageId}/publish' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: {
          name: string
          value: string
          inline: boolean
        }[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: {
          name: string
          id?: string
          animated?: boolean
        }
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object[]
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
  }
}
POST/v1/messaging/channels/:channelId/followers

Has targetChannelId (a text channel where you have MANAGE_WEBHOOKS) follow this announcement channel, which you need to see. The target channel gets a notice; it can follow up to 10 channels.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/followers' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

DELETE/v1/messaging/channels/:channelId/followers/:targetChannelId

Stops a channel following this announcement channel. MANAGE_WEBHOOKS in the following channel.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

  • targetChannelId

    The following channel's id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/followers/{targetChannelId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/servers/:serverId/following

The announcement channels this server's channels follow, with their server and channel names. MANAGE_WEBHOOKS.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/following' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  following: {
    sourceServerId: string
    sourceServerName: string
    sourceServerIcon: null | string
    sourceChannelId: string
    sourceChannelName: string
    targetChannelId: string
    createdAt: number
  }[]
}
GET/v1/messaging/follow-targets

Where you can have a channel follow an announcement channel: by server, the text channels where you have MANAGE_WEBHOOKS.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/follow-targets' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  servers: {
    serverId: string
    name: string
    icon: null | string
    channels: {
      channelId: string
      name: string
      type: "text" | "voice" | "category" | "announcement" | "forum" | "stage"
    }[]
  }[]
}
POST/v1/messaging/channels/:channelId/unread

Marks a channel or thread unread from messageId on (the read marker moves to the message before it).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/unread' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  channelId: string
  lastReadId: string
  mentions: number
}
POST/v1/messaging/channels/:channelId/ack

Marks the channel read up to messageId and clears its mentions; your other devices hear.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/ack' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  channelId: string
  lastReadId: string
  mentions: number
}
POST/v1/messaging/channels/:channelId/typing

Shows you typing to the channel for 8 seconds.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/typing' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/uploads

Where to PUT a file (channelId, name, size up to 25 MB, mime) before sending it as an attachment (ATTACH_FILES).

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/uploads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  attachmentId: string
  url: string
  headers: {
    "content-type": string
  }
}
GET/v1/messaging/channels/:channelId/threads

A channel's threads you can see: active ones, or archived ones with archived=1, most recently active first.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Query parameters

  • archivedstring

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/threads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  threads: {
    joined: boolean
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }[]
}
POST/v1/messaging/channels/:channelId/threads

Starts a thread (name; messageId to start it from a message; private in text channels; autoArchive 60, 1440, 4320 or 10080 minutes). In a forum channel it's a post and needs a first message. CREATE_THREADS.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/threads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  thread: {
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }
}
GET/v1/messaging/servers/:serverId/threads

The active threads you follow in a server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/threads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  threads: {
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }[]
}
GET/v1/messaging/threads/:threadId

A thread with its members. Its messages use the channel message routes with the thread's id.

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

Path parameters

  • threadId

    Conversation id (thr_…), or in Mirage a thread id (mth_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/threads/{threadId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  thread: {
    members: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }[]
    joined: boolean
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }
}
PATCH/v1/messaging/threads/:threadId

Renames, archives, unarchives or changes a thread's auto-archive (its creator or MANAGE_THREADS); locks it (MANAGE_THREADS).

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

Path parameters

  • threadId

    Conversation id (thr_…), or in Mirage a thread id (mth_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/threads/{threadId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  thread: {
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }
}
DELETE/v1/messaging/threads/:threadId

Deletes a thread and its messages. MANAGE_THREADS.

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

Path parameters

  • threadId

    Conversation id (thr_…), or in Mirage a thread id (mth_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/threads/{threadId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

PUT/v1/messaging/threads/:threadId/members/me

Follows a thread.

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

Path parameters

  • threadId

    Conversation id (thr_…), or in Mirage a thread id (mth_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/threads/{threadId}/members/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  thread: {
    members: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }[]
    joined: boolean
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }
}
DELETE/v1/messaging/threads/:threadId/members/me

Stops following a thread.

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

Path parameters

  • threadId

    Conversation id (thr_…), or in Mirage a thread id (mth_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/threads/{threadId}/members/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  thread: {
    members: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }[]
    joined: boolean
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }
}
PUT/v1/messaging/threads/:threadId/members/:userId

Adds someone to a thread (private threads: its members or MANAGE_THREADS).

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

Path parameters

  • threadId

    Conversation id (thr_…), or in Mirage a thread id (mth_…).

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/threads/{threadId}/members/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  thread: {
    members: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }[]
    joined: boolean
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }
}
DELETE/v1/messaging/threads/:threadId/members/:userId

Removes someone from a thread (themselves, its creator or MANAGE_THREADS).

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

Path parameters

  • threadId

    Conversation id (thr_…), or in Mirage a thread id (mth_…).

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/threads/{threadId}/members/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  thread: {
    members: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }[]
    joined: boolean
    threadId: string
    parentId: string
    serverId: string
    name: string
    ownerId: string
    starterMessageId: null | string
    private: boolean
    locked: boolean
    archived: boolean
    autoArchive: number
    lastActivityAt: number
    lastMessageId: null | string
    messageCount: number
    memberCount: number
    createdAt: number
  }
}
GET/v1/messaging/relationships

Your friends, friend requests (incoming and outgoing) and people you've blocked.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/relationships' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  relationships: {
    userId: string
    name: string
    avatarUrl: null | string
    type: "blocked" | "friend" | "incoming" | "outgoing"
    since: number
  }[]
}
POST/v1/messaging/relationships

Sends a friend request by userId or exact email (the answer is the same whether or not the address has an account). Accepts theirs if they already asked you.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/relationships' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  sent: boolean
  friends?: undefined
} | {
  sent: boolean
  friends: boolean
}
PUT/v1/messaging/relationships/:userId

Accepts a friend request.

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

Path parameters

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/relationships/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  sent: boolean
  friends: boolean
}
PUT/v1/messaging/relationships/:userId/block

Blocks someone: no friendship, requests or DMs between you. They aren't told.

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

Path parameters

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/relationships/{userId}/block' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

DELETE/v1/messaging/relationships/:userId

Removes a friend, cancels or declines a request, or unblocks.

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

Path parameters

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/relationships/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/devices

Your devices registered for end-to-end DMs.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/devices' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  devices: {
    deviceId: string
    name: null | string
    lastSeenAt: number
    createdAt: number
    registeredAt: number
  }[]
}
GET/v1/messaging/devices/signer

Mirage's device-signing key (a P-256 JWK, or null on a stage without one): devices check other devices' certificates with it before sealing keys for them.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/devices/signer' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  publicKey: null | {
    kty: "EC"
    crv: "P-256"
    x: string
    y: string
    kid: string
  }
}
PUT/v1/messaging/devices/:deviceId

Registers a device's public key (a P-256 JWK, publicKey) for end-to-end DMs, again on each launch. Mirage certifies it; a new device's conversations ask their members' devices to share their keys with it.

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

Path parameters

  • deviceId

    Device id: an agent's (dev_…); under /v1/me/notifications a phone's install id; under /v1/me/sign-in-approvals a phone that approves sign-ins (apd_…); under /v1/me/vault the id a device made for its vault (22 base64url characters).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/devices/{deviceId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  deviceId: string
  registeredAt: number
}
DELETE/v1/messaging/devices/:deviceId

Removes a device: conversations move to new keys it doesn't get.

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

Path parameters

  • deviceId

    Device id: an agent's (dev_…); under /v1/me/notifications a phone's install id; under /v1/me/sign-in-approvals a phone that approves sign-ins (apd_…); under /v1/me/vault the id a device made for its vault (22 base64url characters).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/devices/{deviceId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/dms

Your open DMs and group DMs, most recent first, with members, the current key version and read position.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  dms: {
    dmId: string
    type: "group" | "dm"
    name: null | string
    icon: null | string
    ownerId: null | string
    members: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: object
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }[]
    memberSince: {
      [key: string]: number
    }
    keyVersion: number
    keyRequestAt: null | number
    lastMessageId: null | string
    lastReadId: string
    createdAt: number
    updatedAt: number
  }[]
}
POST/v1/messaging/dms

Opens a DM with one person (userIds: [id], reusing the existing one) or a group DM with up to 9 others (name optional). Friends and people you share a server with.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  dm: {
    dmId: string
    type: "group" | "dm"
    name: null | string
    icon: null | string
    ownerId: null | string
    members: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }[]
    memberSince: {
      [key: string]: number
    }
    keyVersion: number
    keyRequestAt: null | number
    lastMessageId: null | string
    lastReadId: string
    createdAt: number
    updatedAt: number
  }
}
GET/v1/messaging/dms/candidates

People you can message: friends first, then people in your servers (q filters by name).

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

Query parameters

  • qstring

    Default "".

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/candidates' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  people: {
    friend: boolean
    userId: string
    name: string
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    bot?: "platform" | "server" | "bot"
    external?: "discord" | "webhook"
  }[]
}
PATCH/v1/messaging/dms/:dmId

Changes a group DM: its name or icon (name, icon; any member, and the conversation says who), or its members (add, remove; removing is the owner's). Membership changes start a new key version.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/dms/{dmId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  dm: {
    dmId: string
    type: "group" | "dm"
    name: null | string
    icon: null | string
    ownerId: null | string
    members: {
      userId: string
      name: string
      avatarUrl: null | string
      bannerUrl: null | string
      banner: null | string
      accent: null | string
      about: null | string
      effect: null | {
        id: string
        renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
        colors: string[]
      }
      username: null | string
      kind: "org" | "personal"
      badges: {
        kind: "early-supporter"
        since: null | number
      } | {
        kind: "subscriber"
        since: number
        tier: {
          form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
          name: string
          months: number
          art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
          id: string
        }
      }[]
      bot?: "platform" | "server" | "bot"
      external?: "discord" | "webhook"
    }[]
    memberSince: {
      [key: string]: number
    }
    keyVersion: number
    keyRequestAt: null | number
    lastMessageId: null | string
    lastReadId: string
    createdAt: number
    updatedAt: number
  }
}
DELETE/v1/messaging/dms/:dmId

Closes a DM (it reopens with the next message) or leaves a group DM.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/dms/{dmId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/dms/:dmId/devices

The members' certified devices in use, each with its certificate and whether it has the current key, and the current key version.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/devices' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  keyVersion: number
  keyCreated: boolean
  devices: {
    hasKey: boolean
    userId: string
    deviceId: string
    publicKey: string
    name: null | string
    registeredAt: number
    cert: null | string
  }[]
}
GET/v1/messaging/dms/:dmId/keys

The conversation keys sealed for one of your devices (device), every version it has, each with the device that sealed it; which members can still share each version (holders); and when your device registered.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Query parameters

  • devicestring

    Default "".

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/keys' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  keys: {
    keyVersion: number
    senderDeviceId: string
    senderPublicKey: string
    iv: string
    sealed: string
    sender: null | {
      userId: string
      deviceId: string
      publicKey: string
      name: null | string
      registeredAt: number
      cert: null | string
      hasKey?: boolean
    }
  }[]
  keyVersion: number
  memberIds: string[]
  holders: {
    [key: string]: string[]
  }
  device: null | {
    registeredAt: number
  }
}
GET/v1/messaging/dms/:dmId/keys/missing

Members' certified devices without a key version that exists, so any member's device that has it can seal it for them.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/keys/missing' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  devices: {
    userId: string
    deviceId: string
    publicKey: string
    name: null | string
    registeredAt: number
    cert: null | string
    hasKey?: boolean
    keyVersions: number[]
  }[]
}
POST/v1/messaging/dms/:dmId/keys

Stores conversation keys a member's device sealed (senderDeviceId, keys), for current members' certified devices: the current version's key (create, once), the next version's (rotate), or versions the device has, shared with devices that lack them.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/keys' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  stored: number
  keyVersion: number
} | {
  stored: number
  keyVersion?: undefined
}
POST/v1/messaging/dms/:dmId/keys/request

Asks the members' devices to share keys one of your devices lacks (deviceId); at most once a minute per conversation.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/keys/request' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  asked: boolean
}
GET/v1/messaging/dms/:dmId/messages

A page of encrypted messages, oldest first (before, limit), with their encrypted reactions and votes; thread replies only with thread (the message that started it; after for newer).

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Query parameters

  • beforestring
  • afterstring
  • threadstring
  • limitstring

    Default 50.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  messages: {
    messageId: string
    dmId: string
    authorId: string
    type: "default" | "system"
    senderDeviceId: null | string
    keyVersion: null | number
    iv: null | string
    ciphertext: null | string
    system: null | {
      event?: string
      userIds?: string[]
      name?: string
      messageId?: string
    }
    editedAt: null | number
    editCount: number
    createdAt: number
    nonce: null | string
    attachmentIds: string[]
    poll: null | {
      endsAt: number
      closedAt: null | number
    }
    threadId: null | string
    thread: null | {
      count: number
      lastAt: number
    }
    pinned: boolean
    marks: {
      kind: "reactions" | "vote"
      userId: string
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      updatedAt: number
    }[]
  }[]
  hasMore: boolean
}
GET/v1/messaging/dms/:dmId/messages/:messageId

One encrypted message (a reply's original, a pin or a saved message).

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    dmId: string
    authorId: string
    type: "default" | "system"
    senderDeviceId: null | string
    keyVersion: null | number
    iv: null | string
    ciphertext: null | string
    system: null | {
      event?: string
      userIds?: string[]
      name?: string
      messageId?: string
    }
    editedAt: null | number
    editCount: number
    createdAt: number
    nonce: null | string
    attachmentIds: string[]
    poll: null | {
      endsAt: number
      closedAt: null | number
    }
    threadId: null | string
    thread: null | {
      count: number
      lastAt: number
    }
    pinned: boolean
    marks: {
      kind: "reactions" | "vote"
      userId: string
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      updatedAt: number
    }[]
  }
}
GET/v1/messaging/dms/:dmId/messages/:messageId/edits

An edited message's earlier versions, oldest first, each still encrypted under the key it was written with.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages/{messageId}/edits' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  edits: {
    messageId: string
    writtenAt: number
    replacedAt: number
    senderDeviceId: string
    keyVersion: number
    iv: string
    ciphertext: string
  }[]
}
PUT/v1/messaging/dms/:dmId/messages/:messageId/marks/:kind

Sets your encrypted reactions to a message (reactions) or your vote in its poll (vote), with the current key; members hear dm_mark.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

  • kind

    What the resource is: project (a Serverless App Service), database, bucket, domain, repository or agent; under vehicles the kind of schedule, charge or precondition.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages/{messageId}/marks/{kind}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  mark: {
    kind: "reactions" | "vote"
    userId: string
    senderDeviceId: string
    keyVersion: number
    iv: string
    ciphertext: string
    updatedAt: number
  }
}
DELETE/v1/messaging/dms/:dmId/messages/:messageId/marks/:kind

Takes back your reactions to a message, or your vote.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

  • kind

    What the resource is: project (a Serverless App Service), database, bucket, domain, repository or agent; under vehicles the kind of schedule, charge or precondition.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages/{messageId}/marks/{kind}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/dms/:dmId/messages/:messageId/poll/end

Ends your poll early: it takes no more votes.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages/{messageId}/poll/end' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    dmId: string
    authorId: string
    type: "default" | "system"
    senderDeviceId: null | string
    keyVersion: null | number
    iv: null | string
    ciphertext: null | string
    system: null | {
      event?: string
      userIds?: string[]
      name?: string
      messageId?: string
    }
    editedAt: null | number
    editCount: number
    createdAt: number
    nonce: null | string
    attachmentIds: string[]
    poll: null | {
      endsAt: number
      closedAt: null | number
    }
    threadId: null | string
    thread: null | {
      count: number
      lastAt: number
    }
    pinned: boolean
    marks: {
      kind: "reactions" | "vote"
      userId: string
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      updatedAt: number
    }[]
  }
}
POST/v1/messaging/dms/:dmId/messages/:messageId/forward

Forwards a DM's text to up to 5 channels (to, optional note): your device decrypts it and sends the copy (copy.content); its files stay in the DM.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages/{messageId}/forward' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  results: {
    channelId: string
    messageId?: string
    error?: string
  }[]
}
GET/v1/messaging/dms/:dmId/pins

The conversation's pinned messages, most recently pinned first.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/pins' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  messages: {
    messageId: string
    dmId: string
    authorId: string
    type: "default" | "system"
    senderDeviceId: null | string
    keyVersion: null | number
    iv: null | string
    ciphertext: null | string
    system: null | {
      event?: string
      userIds?: string[]
      name?: string
      messageId?: string
    }
    editedAt: null | number
    editCount: number
    createdAt: number
    nonce: null | string
    attachmentIds: string[]
    poll: null | {
      endsAt: number
      closedAt: null | number
    }
    threadId: null | string
    thread: null | {
      count: number
      lastAt: number
    }
    pinned: boolean
    marks: {
      kind: "reactions" | "vote"
      userId: string
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      updatedAt: number
    }[]
  }[]
}
PUT/v1/messaging/dms/:dmId/pins/:messageId

Pins a message (any member, up to 50); the conversation says who.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/pins/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    dmId: string
    authorId: string
    type: "default" | "system"
    senderDeviceId: null | string
    keyVersion: null | number
    iv: null | string
    ciphertext: null | string
    system: null | {
      event?: string
      userIds?: string[]
      name?: string
      messageId?: string
    }
    editedAt: null | number
    editCount: number
    createdAt: number
    nonce: null | string
    attachmentIds: string[]
    poll: null | {
      endsAt: number
      closedAt: null | number
    }
    threadId: null | string
    thread: null | {
      count: number
      lastAt: number
    }
    pinned: boolean
    marks: {
      kind: "reactions" | "vote"
      userId: string
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      updatedAt: number
    }[]
  }
}
DELETE/v1/messaging/dms/:dmId/pins/:messageId

Unpins a message.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/pins/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    dmId: string
    authorId: string
    type: "default" | "system"
    senderDeviceId: null | string
    keyVersion: null | number
    iv: null | string
    ciphertext: null | string
    system: null | {
      event?: string
      userIds?: string[]
      name?: string
      messageId?: string
    }
    editedAt: null | number
    editCount: number
    createdAt: number
    nonce: null | string
    attachmentIds: string[]
    poll: null | {
      endsAt: number
      closedAt: null | number
    }
    threadId: null | string
    thread: null | {
      count: number
      lastAt: number
    }
    pinned: boolean
    marks: {
      kind: "reactions" | "vote"
      userId: string
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      updatedAt: number
    }[]
  }
}
POST/v1/messaging/dms/:dmId/uploads

Where to PUT a file's ciphertext before sending it (size, up to 25 MB): the file is encrypted on your device under a key the message's ciphertext holds.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/uploads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  uploadId: string
  url: string
  headers: {
    "content-type": string
  }
}
GET/v1/messaging/dms/:dmId/files/:uploadId

A short-lived URL for one of the conversation's files (its ciphertext; your device decrypts it).

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • uploadId

    Upload id (dup_…), from starting the upload.

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/files/{uploadId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  url: string
}
POST/v1/messaging/dms/:dmId/icon/uploads

Where to PUT a group DM's new icon (mime, size up to 2 MB); PATCH /v1/messaging/dms/:dmId with icon sets it.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/icon/uploads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  icon: string
  url: string
  headers: {
    "content-type": "image/png" | "image/jpeg" | "image/webp" | "image/gif"
  }
}
GET/v1/messaging/dms/:dmId/icon

Redirects to a group DM's icon (members only; the image isn't encrypted, as the group's name isn't). ?as=url answers { url }, a short-lived link, instead.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Query parameters

  • asstring

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
  • 404This group has no icon.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/icon' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  url: string
}
POST/v1/messaging/dms/:dmId/scheduled

Send Later in a DM: a message your device sealed now (senderDeviceId, keyVersion, iv, ciphertext), sent at at. If the key changes first it waits for your device to seal it again.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/scheduled' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  scheduled: {
    dm?: {
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      stale: boolean
    }
    scheduledId: string
    kind: "message" | "reminder"
    serverId: string
    channelId: string
    content: null | string
    messageId: null | string
    at: number
    createdAt: number
  }
}
POST/v1/messaging/dms/:dmId/reminders

Remind Me about a DM message (messageId, at): it's saved to Later, and the reminder says who sent it, not what.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/reminders' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  scheduled: {
    dm?: {
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      stale: boolean
    }
    scheduledId: string
    kind: "message" | "reminder"
    serverId: string
    channelId: string
    content: null | string
    messageId: null | string
    at: number
    createdAt: number
  }
}
GET/v1/messaging/composer-settings

What the composer offers: gifs (enabled, the provider and its label, shown as "Powered by") and voiceMaxSeconds, the longest voice message (a platform limit).

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

Response 200

{
  gifs: {
    enabled: true
    provider: "klipy" | "giphy"
    label: string
  } | {
    enabled: false
    provider: null
    label: null
  }
  voiceMaxSeconds: number
}
GET/v1/messaging/gifs

Trending GIFs, or a search with q; page (from next) and locale. 24 a page; every preview link (preview.mp4, gif, still) loads from Mirage. Send a GIF by sending its url as a message. 60 a minute.

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

Query parameters

  • qstring
  • pagestring
  • localestring

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/gifs' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  provider: "klipy" | "giphy"
  label: string
  items: {
    provider: "klipy" | "giphy"
    id: string
    url: string
    title: string
    width: number
    height: number
    preview: {
      mp4: null | string
      gif: null | string
      still: null | string
      width: number
      height: number
    }
  }[]
  next: null | number
}
GET/v1/messaging/gifs/favourites

Your favourite GIFs, newest first.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/gifs/favourites' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  favourites: {
    provider: "klipy" | "giphy"
    id: string
    url: string
    title: string
    width: number
    height: number
    preview: {
      mp4: null | string
      gif: null | string
      still: null | string
      width: number
      height: number
    }
  }[]
}
PUT/v1/messaging/gifs/favourites

Adds a GIF to your favourites (provider, id), looked up with its provider; up to mirage.gifs.favourites (a platform limit).

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/gifs/favourites' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  favourites: {
    provider: "klipy" | "giphy"
    id: string
    url: string
    title: string
    width: number
    height: number
    preview: {
      mp4: null | string
      gif: null | string
      still: null | string
      width: number
      height: number
    }
  }[]
}
DELETE/v1/messaging/gifs/favourites/:provider/:gifId

Takes a GIF out of your favourites.

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

Path parameters

  • provider

    GIF provider: klipy or giphy.

  • gifId

    The GIF's id with its provider (GIPHY's id, KLIPY's slug).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/gifs/favourites/{provider}/{gifId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  favourites: {
    provider: "klipy" | "giphy"
    id: string
    url: string
    title: string
    width: number
    height: number
    preview: {
      mp4: null | string
      gif: null | string
      still: null | string
      width: number
      height: number
    }
  }[]
}
POST/v1/messaging/link-previews

A link's preview for a DM you're writing (url): fetched by the API (browsers can't; YouTube, X, Spotify, Vimeo, SoundCloud and TikTok through their oEmbed), with its image up to 1 MB, kept nowhere; a GIF provider's link comes with its still and animated GIF. Your device encrypts it into the message. 30 a minute.

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

Errors

  • 400Give a link.
  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/link-previews' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  preview: null | {
    gif: {
      mime: string
      data: string
      width: number
      height: number
    }
    image?: {
      mime: string
      data: string
      width: number
      height: number
    }
    title?: string
    url: string
    type: "gifv"
    siteName: string
  } | {
    url: string
    type: "image"
    image: {
      width?: number
      height?: number
      mime: string
      data: string
    }
  } | {
    image?: {
      width?: number
      height?: number
      mime: string
      data: string
    }
    thumbnail?: boolean
    color?: string
    author?: string
    siteName?: string
    description?: string
    title?: string
    url: string
    type: "link" | "video"
  }
}
POST/v1/messaging/dms/:dmId/messages

Sends an encrypted message (senderDeviceId, keyVersion: the current one, iv, ciphertext, nonce). With strict, refused (409 devices_missing, listing them) while a member's current device lacks the key. In the clear for the API: attachmentIds (uploaded files), poll.endsAt, threadId.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  message: {
    messageId: string
    dmId: string
    authorId: string
    type: "default" | "system"
    senderDeviceId: null | string
    keyVersion: null | number
    iv: null | string
    ciphertext: null | string
    system: null | {
      event?: string
      userIds?: string[]
      name?: string
      messageId?: string
    }
    editedAt: null | number
    editCount: number
    createdAt: number
    nonce: null | string
    attachmentIds: string[]
    poll: null | {
      endsAt: number
      closedAt: null | number
    }
    threadId: null | string
    thread: null | {
      count: number
      lastAt: number
    }
    pinned: boolean
    marks: {
      kind: "reactions" | "vote"
      userId: string
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      updatedAt: number
    }[]
  }
}
PATCH/v1/messaging/dms/:dmId/messages/:messageId

Replaces your message's ciphertext (an edit); the version it replaces is kept for the edit history.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  message: {
    messageId: string
    dmId: string
    authorId: string
    type: "default" | "system"
    senderDeviceId: null | string
    keyVersion: null | number
    iv: null | string
    ciphertext: null | string
    system: null | {
      event?: string
      userIds?: string[]
      name?: string
      messageId?: string
    }
    editedAt: null | number
    editCount: number
    createdAt: number
    nonce: null | string
    attachmentIds: string[]
    poll: null | {
      endsAt: number
      closedAt: null | number
    }
    threadId: null | string
    thread: null | {
      count: number
      lastAt: number
    }
    pinned: boolean
    marks: {
      kind: "reactions" | "vote"
      userId: string
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      updatedAt: number
    }[]
  }
}
DELETE/v1/messaging/dms/:dmId/messages/:messageId

Deletes your message.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/messages/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/dms/:dmId/ack

Marks the DM read up to messageId.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/ack' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/dms/:dmId/typing

Shows you typing to the others for 8 seconds.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/typing' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/channels/:channelId/summary

Catch Me Up: Caity summarises what you haven't read in the channel (or its recent conversation when you're up to date) and sends it to you alone over the socket as caity_summary (channelId, text, count). It reads only what Caity may read, for someone who can read the channel; counts against your hourly questions to Caity. READ_MESSAGE_HISTORY.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/summary' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 202

{
  pending: boolean
}
GET/v1/messaging/saved

Your Later list: messages you saved, newest saved first, each with done and the message (null when it was deleted or you can't read it any more). Up to 500.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/saved' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  saved: {
    dmMessage?: null | {
      messageId: string
      dmId: string
      authorId: string
      type: "default" | "system"
      senderDeviceId: null | string
      keyVersion: null | number
      iv: null | string
      ciphertext: null | string
      system: null | {
        event?: string
        userIds?: string[]
        name?: string
        messageId?: string
      }
      editedAt: null | number
      editCount: number
      createdAt: number
      nonce: null | string
      attachmentIds: string[]
      poll: null | {
        endsAt: number
        closedAt: null | number
      }
      threadId: null | string
      thread: null | {
        count: number
        lastAt: number
      }
      pinned: boolean
      marks: {
        kind: "reactions" | "vote"
        userId: string
        senderDeviceId: string
        keyVersion: number
        iv: string
        ciphertext: string
        updatedAt: number
      }[]
    }
    messageId: string
    channelId: string
    serverId: string
    done: boolean
    savedAt: number
    message: null | {
      messageId: string
      channelId: string
      serverId: string
      author: {
        userId: string
        name: string
        bot: "server"
        avatarUrl: null
      } | {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      type: "default" | "join" | "system" | "reply" | "pin" | "follow"
      content: string
      replyTo: null | {
        author: {
          avatarUrl: null | string
          external?: "discord" | "webhook"
          bot?: "platform" | "server" | "bot"
          userId: string
          name: string
        }
        content: string
        messageId: string
      } | {
        deleted: boolean
        messageId: string
      }
      mentions: string[]
      mentionRoles: string[]
      mentionEveryone: boolean
      attachments: {
        url: string
        durationSecs?: null | number
        waveform?: string
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
      }[]
      reactions: {
        emoji: string
        count: number
        me: boolean
      }[]
      pinned: boolean
      thread: null | {
        threadId: string
        name: string
        messageCount: number
        lastActivityAt: number
        archived: boolean
      }
      poll: null | {
        question: string
        answers: {
          answerId: string
          text: string
          emoji: null | string
          count: number
        }[]
        multiple: boolean
        expiresAt: number
        closed: boolean
        total: number
        mine: string[]
      }
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: object[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      editedAt: null | number
      createdAt: number
      nonce: null | string
      interaction: null | {
        interactionId: string
        name: string
        userId: string
        userName: string
        options?: {
          name: string
          value: boolean | string | number
        }[]
        kind?: "command" | "component" | "modal"
        label?: string
      }
      forwarded: null | {
        content: string
        attachments: {
          attachmentId: string
          name: string
          mime: string
          size: number
          width: null | number
          height: null | number
          url: string
        }[]
        embeds: {
          url: string
          type: "link" | "video" | "image" | "gifv" | "rich"
          title: null | string
          description: null | string
          siteName: null | string
          author: null | string
          color: null | string
          thumbnail: boolean
          image: null | object
          video: null | object
          gif: null | object
          provider: null | string
          authorUrl: null | string
          authorIcon: null | object
          thumb: null | object
          fields: object
          footer: null | string
          footerIcon: null | object
          timestamp: null | number
          source: null | string
        }[]
        origin: {
          serverId: string
          channelId: string
          messageId: string
          createdAt: number
        }
      }
      published: boolean
      crosspost: null | {
        serverId: string
        channelId: string
        messageId: string
        serverName: string
        channelName: string
        serverIcon: null | string
      }
      display: null | {
        source: "discord" | "webhook"
        name: null | string
        avatarUrl: null | string
        linked: boolean
        externalId: null | string
        externalAuthorId: null | string
      }
      stickers: {
        stickerId: string
        name: string
        format: "gif" | "png" | "webp" | "apng" | "lottie"
      }[]
      components: {
        type: 1
        components: object[]
      }[]
    }
  }[]
}
GET/v1/messaging/saved/ids

The ids of the messages you saved (for showing Save or Remove).

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/saved/ids' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ids: string[]
}
PUT/v1/messaging/saved/:messageId

Saves a message for later (channelId where it is). You need to be able to read it.

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

Path parameters

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/saved/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  saved: boolean
}
PATCH/v1/messaging/saved/:messageId

Marks a saved message done (done: true) or not.

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

Path parameters

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/saved/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

DELETE/v1/messaging/saved/:messageId

Removes a message from your Later list.

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

Path parameters

  • messageId

    Message id (msg_…; Mirage messages are mmg_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/saved/{messageId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/users/:userId/profile

Someone beyond their card: the servers you're both in (with their nickname there), your mutual friends, and your private note about them. Only for people in a server or conversation with you, or among your friends, requests and blocks; 404 otherwise.

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

Path parameters

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/users/{userId}/profile' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  person: {
    avatarUrl: null | string
    bannerUrl: null | string
    banner: null | string
    accent: null | string
    about: null | string
    effect: null | {
      id: string
      renderer: "sparkles" | "snow" | "hearts" | "glow" | "aurora" | "confetti"
      colors: string[]
    }
    username: null | string
    kind: "org" | "personal"
    badges: {
      kind: "early-supporter"
      since: null | number
    } | {
      kind: "subscriber"
      since: number
      tier: {
        form: "stone" | "cut" | "brilliant" | "radiant" | "spark"
        name: string
        months: number
        art: "quartz" | "bronze" | "silver" | "gold" | "platinum" | "diamond" | "emerald" | "ruby" | "opal" | "early"
        id: string
      }
    }[]
    name: string
  }
  mutualServers: {
    serverId: string
    name: string
    icon: null | string
    nick: null | string
  }[]
  mutualFriends: {
    userId: string
    name: string
    avatarUrl: null | string
  }[]
  note: null | string
}
PUT/v1/messaging/users/:userId/note

Your private note about someone (note, up to 256 characters; empty clears it). Only you see it.

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

Path parameters

  • userId

    A member's user id (usr_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/users/{userId}/note' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  note: null | string
}
POST/v1/messaging/channels/:channelId/webhooks

Makes an incoming webhook in a text or announcement channel (name, default Webhook; Manage Webhooks there; up to 15 a channel by default, as platform data sets). The answer's url holds the token: it's shown this once, and whoever has it can post.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/webhooks' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  webhook: {
    webhookId: string
    serverId: string
    channelId: string
    name: string
    createdBy: string
    createdAt: number
    lastUsedAt: null | number
  }
  url: string
}
GET/v1/messaging/servers/:serverId/webhooks

A server's incoming webhooks in the channels where you have Manage Webhooks and can see (name, channel, who made it, when it last posted), never their tokens. Refused without Manage Webhooks anywhere.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/webhooks' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  webhooks: {
    webhookId: string
    serverId: string
    channelId: string
    name: string
    createdBy: string
    createdAt: number
    lastUsedAt: null | number
  }[]
}
PATCH/v1/messaging/servers/:serverId/webhooks/:webhookId

Renames a webhook (name) or moves it to another channel of the server (channelId, where you also manage webhooks).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • webhookId

    Webhook id (whk_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/webhooks/{webhookId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  webhook: {
    webhookId: string
    serverId: string
    channelId: string
    name: string
    createdBy: string
    createdAt: number
    lastUsedAt: null | number
  }
}
POST/v1/messaging/servers/:serverId/webhooks/:webhookId/token

A new token for a webhook: the answer's url replaces the old one, which stops working at once.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • webhookId

    Webhook id (whk_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/webhooks/{webhookId}/token' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  webhook: {
    webhookId: string
    serverId: string
    channelId: string
    name: string
    createdBy: string
    createdAt: number
    lastUsedAt: null | number
  }
  url: string
}
DELETE/v1/messaging/servers/:serverId/webhooks/:webhookId

Deletes a webhook; its URL stops working. Its messages stay.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • webhookId

    Webhook id (whk_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/webhooks/{webhookId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/inbox/mentions

Your recent mentions across your servers, newest first (limit up to 50), each with its server's name: you by name, your roles and @everyone/@here (as each server's suppress settings allow; roles=0 or everyone=0 leaves them out), never your own messages; cursor (the last result's id) for the next page.

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

Query parameters

  • cursorstring
  • limitstring
  • rolesstring
  • everyonestring

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/inbox/mentions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  results: {
    parentId: string
    channelName: null | string
    threadName: null | string
    messageId: string
    channelId: string
    serverId: string
    author: {
      userId: string
      name: string
      bot: "server"
      avatarUrl: null
    } | {
      avatarUrl: null | string
      external?: "discord" | "webhook"
      bot?: "platform" | "server" | "bot"
      userId: string
      name: string
    }
    type: "default" | "join" | "system" | "reply" | "pin" | "follow"
    content: string
    replyTo: null | {
      author: {
        avatarUrl: null | string
        external?: "discord" | "webhook"
        bot?: "platform" | "server" | "bot"
        userId: string
        name: string
      }
      content: string
      messageId: string
    } | {
      deleted: boolean
      messageId: string
    }
    mentions: string[]
    mentionRoles: string[]
    mentionEveryone: boolean
    attachments: {
      url: string
      durationSecs?: null | number
      waveform?: string
      attachmentId: string
      name: string
      mime: string
      size: number
      width: null | number
      height: null | number
    }[]
    reactions: {
      emoji: string
      count: number
      me: boolean
    }[]
    pinned: boolean
    thread: null | {
      threadId: string
      name: string
      messageCount: number
      lastActivityAt: number
      archived: boolean
    }
    poll: null | {
      question: string
      answers: {
        answerId: string
        text: string
        emoji: null | string
        count: number
      }[]
      multiple: boolean
      expiresAt: number
      closed: boolean
      total: number
      mine: string[]
    }
    embeds: {
      url: string
      type: "link" | "video" | "image" | "gifv" | "rich"
      title: null | string
      description: null | string
      siteName: null | string
      author: null | string
      color: null | string
      thumbnail: boolean
      image: null | {
        url: string
        width: null | number
        height: null | number
      }
      video: null | {
        url: string
        width: null | number
        height: null | number
      }
      gif: null | {
        url: string
        width: null | number
        height: null | number
      }
      provider: null | string
      authorUrl: null | string
      authorIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      thumb: null | {
        url: string
        width: null | number
        height: null | number
      }
      fields: {
        name: string
        value: string
        inline: boolean
      }[]
      footer: null | string
      footerIcon: null | {
        url: string
        width: null | number
        height: null | number
      }
      timestamp: null | number
      source: null | string
    }[]
    editedAt: null | number
    createdAt: number
    nonce: null | string
    interaction: null | {
      interactionId: string
      name: string
      userId: string
      userName: string
      options?: {
        name: string
        value: boolean | string | number
      }[]
      kind?: "command" | "component" | "modal"
      label?: string
    }
    forwarded: null | {
      content: string
      attachments: {
        attachmentId: string
        name: string
        mime: string
        size: number
        width: null | number
        height: null | number
        url: string
      }[]
      embeds: {
        url: string
        type: "link" | "video" | "image" | "gifv" | "rich"
        title: null | string
        description: null | string
        siteName: null | string
        author: null | string
        color: null | string
        thumbnail: boolean
        image: null | {
          url: string
          width: null | number
          height: null | number
        }
        video: null | {
          url: string
          width: null | number
          height: null | number
        }
        gif: null | {
          url: string
          width: null | number
          height: null | number
        }
        provider: null | string
        authorUrl: null | string
        authorIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        thumb: null | {
          url: string
          width: null | number
          height: null | number
        }
        fields: object[]
        footer: null | string
        footerIcon: null | {
          url: string
          width: null | number
          height: null | number
        }
        timestamp: null | number
        source: null | string
      }[]
      origin: {
        serverId: string
        channelId: string
        messageId: string
        createdAt: number
      }
    }
    published: boolean
    crosspost: null | {
      serverId: string
      channelId: string
      messageId: string
      serverName: string
      channelName: string
      serverIcon: null | string
    }
    display: null | {
      source: "discord" | "webhook"
      name: null | string
      avatarUrl: null | string
      linked: boolean
      externalId: null | string
      externalAuthorId: null | string
    }
    stickers: {
      stickerId: string
      name: string
      format: "gif" | "png" | "webp" | "apng" | "lottie"
    }[]
    components: {
      type: 1
      components: {
        type: 2
        style: 2 | 1 | 3 | 4 | 5
        label?: string
        emoji?: object
        customId?: string
        url?: string
        disabled?: boolean
      } | {
        type: 3
        customId: string
        options: object
        placeholder?: string
        minValues?: number
        maxValues?: number
        disabled?: boolean
      }[]
    }[]
    serverName: string
  }[]
  cursor: null | string
}
GET/v1/messaging/inbox/unreads

The channels with messages you haven't read, by server, newest first, with their mention counts; muted servers and channels are left out.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/inbox/unreads' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  servers: {
    serverId: string
    name: string
    icon: null | string
    channels: {
      channelId: string
      name: string
      type: "text" | "voice" | "category" | "announcement" | "forum" | "stage"
      lastMessageId: string
      mentions: number
    }[]
  }[]
}
GET/v1/messaging/me/notices

Your notices from the platform, newest first (notices: id, kind (report: a report you filed was reviewed), title, body, read, createdAt; kept 90 days), and how many are unread.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/me/notices' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  notices: {
    noticeId: string
    kind: "report"
    title: string
    body: string
    read: boolean
    createdAt: number
  }[]
  unread: number
}
POST/v1/messaging/me/notices/read

Marks your notices read; your other devices hear (notice event with unread: 0).

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/me/notices/read' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  unread: number
}
POST/v1/messaging/channels/:channelId/scheduled

Send Later: posts content in the channel at at (milliseconds since 1970; at least a minute and at most 120 days ahead), as you, with your permissions then. If it can't go, you hear why over the socket (scheduled_failed, with the text). Up to 50 scheduled messages and reminders at once.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/scheduled' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  scheduled: {
    dm?: {
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      stale: boolean
    }
    scheduledId: string
    kind: "message" | "reminder"
    serverId: string
    channelId: string
    content: null | string
    messageId: null | string
    at: number
    createdAt: number
  }
}
POST/v1/messaging/channels/:channelId/reminders

Remind Me: a reminder about messageId at at, on your open apps (reminder over the socket) and your phone; the message is saved to your Later list now and comes back into progress when it's due.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/reminders' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  scheduled: {
    dm?: {
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      stale: boolean
    }
    scheduledId: string
    kind: "message" | "reminder"
    serverId: string
    channelId: string
    content: null | string
    messageId: null | string
    at: number
    createdAt: number
  }
}
GET/v1/messaging/scheduled

Your scheduled messages and reminders, soonest first (channelId for one channel).

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

Query parameters

  • channelIdstring

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/scheduled' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  scheduled: {
    dm?: {
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      stale: boolean
    }
    scheduledId: string
    kind: "message" | "reminder"
    serverId: string
    channelId: string
    content: null | string
    messageId: null | string
    at: number
    createdAt: number
  }[]
}
PATCH/v1/messaging/scheduled/:scheduledId

Changes a scheduled message's content or at (a reminder's at).

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

Path parameters

  • scheduledId

    Mirage scheduled message or reminder id (msc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/scheduled/{scheduledId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  scheduled: {
    dm?: {
      senderDeviceId: string
      keyVersion: number
      iv: string
      ciphertext: string
      stale: boolean
    }
    scheduledId: string
    kind: "message" | "reminder"
    serverId: string
    channelId: string
    content: null | string
    messageId: null | string
    at: number
    createdAt: number
  }
}
DELETE/v1/messaging/scheduled/:scheduledId

Cancels a scheduled message or reminder.

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

Path parameters

  • scheduledId

    Mirage scheduled message or reminder id (msc_…).

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/scheduled/{scheduledId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/reports

Reports something to the people who can act on it: kind message (channelId, messageId: the server's moderators), user (userId, with serverId for that server's moderators) or dm_message (dmId, messageId and content, the text as your device decrypted it: platform staff only). With a reason (spam, harassment, hate, violence, self_harm, sexual, illegal, impersonation, other) and optional details. A copy of what was reported is kept; moderators don't see who reported. Once per thing, and up to 20 an hour.

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/reports' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  reportId: string
}
GET/v1/messaging/servers/:serverId/reports

A server's open reports (status=all for every one), newest first, with a copy of what was reported. For moderators: Manage Messages, Moderate Members, Kick Members or Ban Members.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Query parameters

  • statusstring

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/reports' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

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

Marks a report actioned or dismissed (with an optional note), or open again. For moderators.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • reportId

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

Errors

  • 403Bots can't use this route.
  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/reports/{reportId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

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

Joins a voice or stage channel (CONNECT), starting its meeting when nobody's in it; on a stage you join the audience, listening, and in the server's AFK channel join is null (there's no call). Returns your voice state and join: the meeting, your attendee and its join token (yours alone), the channel's audio profile and camera quality, and local on the local stack. sessionId names this tab or app; joining elsewhere leaves where you were. A full channel (userLimit) refuses unless you have MOVE_MEMBERS; without SPEAK you only listen, without STREAM camera and screen share are receive-only, and server mute and deafen apply.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/voice' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voiceState: {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }
  join: null | {
    placeId: string
    kind: "call" | "channel"
    meeting: {
      MeetingId: string
      MediaRegion: string
      ExternalMeetingId?: string
      MeetingArn?: string
      MediaPlacement: {
        [key: string]: undefined | string
      }
      MeetingFeatures?: unknown
    }
    attendee: {
      AttendeeId: string
      ExternalUserId: string
      JoinToken: string
    }
    local: boolean
    audio: {
      bitrateBps: number
      stereo: boolean
      speech: boolean
    }
    video: {
      width: number
      height: number
      frameRate: number
    }
  }
}
GET/v1/messaging/servers/:serverId/voice-states

Who's connected to the server's voice channels you can see, with their mute, deafen, camera and screen share.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/voice-states' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voiceStates: {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }[]
}
PATCH/v1/messaging/servers/:serverId/voice-states/:userId

Moderators: server mute (mute, MUTE_MEMBERS) or deafen (deaf, DEAFEN_MEMBERS) someone, kept on their membership; move them to another voice or stage channel (channelId: MOVE_MEMBERS there and where they are, CONNECT there; passes the user limit) or disconnect them (channelId: null); on a stage, bring them up to speak (muted) or back to the audience (speaker, stage moderators: MANAGE_CHANNELS, MUTE_MEMBERS and MOVE_MEMBERS there). Moves and disconnects are in the audit log.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • userId

    A member's user id (usr_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/voice-states/{userId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voiceState: null | {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }
}
POST/v1/messaging/channels/:channelId/voice/move

Moves everyone in a voice or stage channel to another (channelId; MOVE_MEMBERS in both, CONNECT there; people who can't see it stay) or disconnects them all (channelId: null). Returns how many moved. In the audit log.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/voice/move' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  moved: number
}
GET/v1/messaging/servers/:serverId/stages

The server's live stages you can see: channel, topic, who started it and when.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/stages' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  stages: {
    channelId: string
    serverId: string
    topic: string
    startedBy: string
    startedAt: number
  }[]
}
PUT/v1/messaging/channels/:channelId/stage

Starts a stage with a topic (up to 120 characters), or changes the topic of a live one. Everyone who can see the channel gets a stage event. Stage moderators.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/stage' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  stage: {
    channelId: string
    serverId: string
    topic: string
    startedBy: string
    startedAt: number
  }
}
DELETE/v1/messaging/channels/:channelId/stage

Ends a live stage; people stay connected. It also ends when the last person leaves. Stage moderators.

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/stage' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

PATCH/v1/messaging/channels/:channelId/stage/me

On a stage you're connected to: raise or lower your hand (request, REQUEST_TO_SPEAK), step down to the audience (speaker: false), or step up to speak (speaker: true, stage moderators).

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

Path parameters

  • channelId

    Mirage channel id (chn_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/channels/{channelId}/stage/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voiceState: {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }
}
GET/v1/messaging/voice/regions

Locations a voice channel can keep its media in (its rtcRegion). Without one, media goes to the location serving whoever starts the call.

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

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/voice/regions' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  regions: {
    locationId: string
    label: string
  }[]
}
GET/v1/messaging/voice/me

Where you're connected (a voice channel or a DM call), or null.

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

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/voice/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voiceState: null | {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }
}
PATCH/v1/messaging/voice/me

Your own mute, deafen, camera and screen share (selfMute, selfDeaf, selfVideo, selfStream) for the session given (sessionId). Camera and screen share need STREAM.

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

Errors

  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/voice/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voiceState: {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }
}
POST/v1/messaging/voice/heartbeat

Keeps your connection listed: every 45 seconds, or after 2 minutes you're taken out. 404 when you aren't connected, 409 when another session took over.

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

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/voice/heartbeat' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voiceState: {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }
}
POST/v1/messaging/voice/idle

Your app saw you idle (not speaking, not using it) for the server's AFK timeout: moves your connection (sessionId) to the server's AFK channel, where there's no call. Nothing happens without an AFK channel.

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

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/voice/idle' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  voiceState: null | {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }
}
POST/v1/messaging/voice/leave

Leaves the voice channel or call, when sessionId is still the one connected (a closed tab's beacon can't end a newer session). The last one out ends the meeting.

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

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/voice/leave' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/calls

Calls going on in your DMs: who's in each and who's being rung.

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

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/calls' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  calls: {
    dmId: string
    startedBy: string
    startedAt: number
    video: boolean
    ringing: string[]
    ringUntil: null | number
    participants: {
      placeId: string
      kind: "call" | "channel"
      serverId: null | string
      dmId: null | string
      userId: string
      sessionId: string
      selfMute: boolean
      selfDeaf: boolean
      selfVideo: boolean
      selfStream: boolean
      mute: boolean
      deaf: boolean
      suppress: boolean
      noStream: boolean
      speaker: boolean
      requestToSpeakAt: null | number
      afk: boolean
      joinedAt: number
    }[]
    messageId: null | string
  }[]
}
GET/v1/messaging/dms/:dmId/call

The DM's call going on, or null.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/call' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  call: null | {
    dmId: string
    startedBy: string
    startedAt: number
    video: boolean
    ringing: string[]
    ringUntil: null | number
    participants: {
      placeId: string
      kind: "call" | "channel"
      serverId: null | string
      dmId: null | string
      userId: string
      sessionId: string
      selfMute: boolean
      selfDeaf: boolean
      selfVideo: boolean
      selfStream: boolean
      mute: boolean
      deaf: boolean
      suppress: boolean
      noStream: boolean
      speaker: boolean
      requestToSpeakAt: null | number
      afk: boolean
      joinedAt: number
    }[]
    messageId: null | string
  }
}
POST/v1/messaging/dms/:dmId/call

Starts a call in a DM or group DM, ringing everyone else for 45 seconds (video starts with cameras on), or joins the one going on (answering). Returns the call, your voice state and join, as for voice channels. Not in a DM where either person blocked the other.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/call' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  call: null | {
    dmId: string
    startedBy: string
    startedAt: number
    video: boolean
    ringing: string[]
    ringUntil: null | number
    participants: {
      placeId: string
      kind: "call" | "channel"
      serverId: null | string
      dmId: null | string
      userId: string
      sessionId: string
      selfMute: boolean
      selfDeaf: boolean
      selfVideo: boolean
      selfStream: boolean
      mute: boolean
      deaf: boolean
      suppress: boolean
      noStream: boolean
      speaker: boolean
      requestToSpeakAt: null | number
      afk: boolean
      joinedAt: number
    }[]
    messageId: null | string
  }
  voiceState: {
    placeId: string
    kind: "call" | "channel"
    serverId: null | string
    dmId: null | string
    userId: string
    sessionId: string
    selfMute: boolean
    selfDeaf: boolean
    selfVideo: boolean
    selfStream: boolean
    mute: boolean
    deaf: boolean
    suppress: boolean
    noStream: boolean
    speaker: boolean
    requestToSpeakAt: null | number
    afk: boolean
    joinedAt: number
  }
  join: null | {
    placeId: string
    kind: "call" | "channel"
    meeting: {
      MeetingId: string
      MediaRegion: string
      ExternalMeetingId?: string
      MeetingArn?: string
      MediaPlacement: {
        [key: string]: undefined | string
      }
      MeetingFeatures?: unknown
    }
    attendee: {
      AttendeeId: string
      ExternalUserId: string
      JoinToken: string
    }
    local: boolean
    audio: {
      bitrateBps: number
      stereo: boolean
      speech: boolean
    }
    video: {
      width: number
      height: number
      frameRate: number
    }
  }
}
POST/v1/messaging/dms/:dmId/call/ring

Rings people in the DM who aren't in the call (userIds, or everyone). You must be in it.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/call/ring' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  call: null | {
    dmId: string
    startedBy: string
    startedAt: number
    video: boolean
    ringing: string[]
    ringUntil: null | number
    participants: {
      placeId: string
      kind: "call" | "channel"
      serverId: null | string
      dmId: null | string
      userId: string
      sessionId: string
      selfMute: boolean
      selfDeaf: boolean
      selfVideo: boolean
      selfStream: boolean
      mute: boolean
      deaf: boolean
      suppress: boolean
      noStream: boolean
      speaker: boolean
      requestToSpeakAt: null | number
      afk: boolean
      joinedAt: number
    }[]
    messageId: null | string
  }
}
POST/v1/messaging/dms/:dmId/call/decline

Stops the call ringing for you.

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

Path parameters

  • dmId

    Mirage DM id (dmc_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/dms/{dmId}/call/decline' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  call: null | {
    dmId: string
    startedBy: string
    startedAt: number
    video: boolean
    ringing: string[]
    ringUntil: null | number
    participants: {
      placeId: string
      kind: "call" | "channel"
      serverId: null | string
      dmId: null | string
      userId: string
      sessionId: string
      selfMute: boolean
      selfDeaf: boolean
      selfVideo: boolean
      selfStream: boolean
      mute: boolean
      deaf: boolean
      suppress: boolean
      noStream: boolean
      speaker: boolean
      requestToSpeakAt: null | number
      afk: boolean
      joinedAt: number
    }[]
    messageId: null | string
  }
}
GET/v1/messaging/servers/:serverId/leaderboards

A server's leaderboards page in one read: its settings (enabled, timeZone, coursesBy, channelId), whether you manage them and may make courses, its boards, courses (with a thinned preview of each route), seasons, badges, your entry, recent awards, its leagues, and the closed circuits speed boards may use. Members, once a manager has turned them on.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  settings: {
    enabled: boolean
    timeZone: string
    coursesBy: "members" | "managers"
    channelId: null | string
  }
  canManage: boolean
  canMakeCourses: boolean
  boards: {
    boardId: string
    name: string
    description: null | string
    emoji: null | string
    metric: string
    period: string
    seasonId: null | string
    from: null | string
    to: null | string
    groupBy: "role" | "member" | "car"
    roleIds: string[]
    models: string[]
    tripClasses: string[]
    minimum: null | number
    circuitId: null | string
    top: number
    anonymous: boolean
    channelId: null | string
    announce: boolean
    position: number
    createdAt: number
  }[]
  courses: {
    preview: [number, number][]
    courseId: string
    name: string
    description: null | string
    emoji: null | string
    km: number
    loop: boolean
    rankBy: "time" | "efficiency" | "topSpeed" | "efforts" | "smoothness"
    circuitId: null | string
    circuitName: null | string
    source: "drive" | "points" | "drawn"
    createdAt: number
  }[]
  seasons: {
    seasonId: string
    name: string
    emoji: null | string
    from: string
    to: string
  }[]
  badges: {
    badgeId: string
    name: string
    emoji: string
    color: null | string
    description: null | string
    rule: {
      kind: "rank"
      boardId: string
      top: number
    } | {
      kind: "threshold"
      metric: string
      value: number
      period: "all" | "month" | "year" | "season"
    } | {
      kind: "course"
      courseId: string
      efforts: number
    } | {
      kind: "manual"
    }
  }[]
  entry: {
    joined: boolean
    vehicles: {
      vehicleId: string
      name: string
      model: null | string
    }[]
    anonymous: boolean
    showCars: boolean
    courses: boolean
    notifyResults: boolean
    notifyRecords: boolean
    paused: boolean
    joinedAt: number
  } | {
    joined: false
    vehicles?: undefined
    anonymous?: undefined
    showCars?: undefined
    courses?: undefined
    notifyResults?: undefined
    notifyRecords?: undefined
    paused?: undefined
    joinedAt?: undefined
  }
  awards: {
    badgeId: string
    awardKey: string
    label: string
    at: number
    person: {
      userId: string
      name: string
      avatarUrl: null | string
      anonymous: boolean
      me: boolean
    }
  }[]
  leagues: {
    code?: string
    leagueId: string
    name: string
    emoji: null | string
    metric: string
    period: string
    aggregate: "total" | "average"
    servers: number
    host: boolean
  }[]
  circuits: {
    circuitId: string
    name: string
    region: string
    lengthKm: number
    boundary: [number, number][]
  }[]
}
PUT/v1/messaging/servers/:serverId/leaderboards/settings

Turns leaderboards on or off and sets the time zone periods are cut in (a place's zone), who may make courses (managers or members) and the channel results are posted in. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/settings' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  settings: {
    enabled: boolean
    timeZone: string
    coursesBy: "members" | "managers"
    channelId: null | string
  }
}
GET/v1/messaging/leaderboards/circuits

The closed circuits speed and lap boards may use (checked and enabled in Admin): names, regions, lengths and boundaries.

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

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/leaderboards/circuits' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  circuits: {
    circuitId: string
    name: string
    region: string
    lengthKm: number
    boundary: [number, number][]
  }[]
}
GET/v1/messaging/servers/:serverId/leaderboards/me

Your entry in a server's leaderboards (joined, the cars entered and your choices) and the cars you may enter: your own, from your Personal space.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  entry: {
    joined: boolean
    vehicles: {
      vehicleId: string
      name: string
      model: null | string
    }[]
    anonymous: boolean
    showCars: boolean
    courses: boolean
    notifyResults: boolean
    notifyRecords: boolean
    paused: boolean
    joinedAt: number
  } | {
    joined: false
    vehicles?: undefined
    anonymous?: undefined
    showCars?: undefined
    courses?: undefined
    notifyResults?: undefined
    notifyRecords?: undefined
    paused?: undefined
    joinedAt?: undefined
  }
  cars: {
    vehicleId: string
    name: string
    model: null | string
  }[]
}
PUT/v1/messaging/servers/:serverId/leaderboards/me

Takes part, or changes which cars do (vehicleIds: up to 5 of your own), with your choices: anonymous (show a stand-in name), showCars, courses (join course boards), notifyResults, notifyRecords, paused. Newly entered cars' drives from the last 90 days are counted too.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  entry: {
    joined: boolean
    vehicles: {
      vehicleId: string
      name: string
      model: null | string
    }[]
    anonymous: boolean
    showCars: boolean
    courses: boolean
    notifyResults: boolean
    notifyRecords: boolean
    paused: boolean
    joinedAt: number
  } | {
    joined: false
    vehicles?: undefined
    anonymous?: undefined
    showCars?: undefined
    courses?: undefined
    notifyResults?: undefined
    notifyRecords?: undefined
    paused?: undefined
    joinedAt?: undefined
  }
  cars: {
    vehicleId: string
    name: string
    model: null | string
  }[]
}
PATCH/v1/messaging/servers/:serverId/leaderboards/me

Changes your choices (anonymous, showCars, courses, notifyResults, notifyRecords, paused).

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  entry: {
    joined: boolean
    vehicles: {
      vehicleId: string
      name: string
      model: null | string
    }[]
    anonymous: boolean
    showCars: boolean
    courses: boolean
    notifyResults: boolean
    notifyRecords: boolean
    paused: boolean
    joinedAt: number
  } | {
    joined: false
    vehicles?: undefined
    anonymous?: undefined
    showCars?: undefined
    courses?: undefined
    notifyResults?: undefined
    notifyRecords?: undefined
    paused?: undefined
    joinedAt?: undefined
  }
}
DELETE/v1/messaging/servers/:serverId/leaderboards/me

Stops taking part: everything counted for you in this server (stats, course efforts, badges) is deleted.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/me' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  entry: {
    joined: boolean
    vehicles: {
      vehicleId: string
      name: string
      model: null | string
    }[]
    anonymous: boolean
    showCars: boolean
    courses: boolean
    notifyResults: boolean
    notifyRecords: boolean
    paused: boolean
    joinedAt: number
  } | {
    joined: false
    vehicles?: undefined
    anonymous?: undefined
    showCars?: undefined
    courses?: undefined
    notifyResults?: undefined
    notifyRecords?: undefined
    paused?: undefined
    joinedAt?: undefined
  }
}
POST/v1/messaging/servers/:serverId/leaderboards/boards

Makes a board: name, metric (efficiency, consistency, regenShare, co2Saved, distance, drives, smoothness, activeDays, streak, offPeakShare, solarShare, superchargerVisits, newSuperchargers, placesExplored, climbing; and on a closed circuit only, with circuitId, bestLap, topSpeed, circuitLaps, circuitDistance), period (week, month, year, all, season with seasonId or the current season, rolling7, rolling30, custom with from and to), groupBy (member, car, role with roleIds), filters (models, tripClasses, minimum), top, anonymous, channelId, announce, emoji, description. Speed and time on public roads are refused. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/boards' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  board: {
    boardId: string
    name: string
    description: null | string
    emoji: null | string
    metric: string
    period: string
    seasonId: null | string
    from: null | string
    to: null | string
    groupBy: "role" | "member" | "car"
    roleIds: string[]
    models: string[]
    tripClasses: string[]
    minimum: null | number
    circuitId: null | string
    top: number
    anonymous: boolean
    channelId: null | string
    announce: boolean
    position: number
    createdAt: number
  }
}
PUT/v1/messaging/servers/:serverId/leaderboards/boards/order

Puts the boards in the order given (boardIds). Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PUT 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/boards/order' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  boards: {
    boardId: string
    name: string
    description: null | string
    emoji: null | string
    metric: string
    period: string
    seasonId: null | string
    from: null | string
    to: null | string
    groupBy: "role" | "member" | "car"
    roleIds: string[]
    models: string[]
    tripClasses: string[]
    minimum: null | number
    circuitId: null | string
    top: number
    anonymous: boolean
    channelId: null | string
    announce: boolean
    position: number
    createdAt: number
  }[]
}
GET/v1/messaging/servers/:serverId/leaderboards/boards/:boardId

A board with its standings for the current period (offset=-1 the one before, back to 52), its period's dates, how its metric reads, and your own place. Stand-in names hide who's behind them, ids included.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • boardId

    Board id: a Tasks board (brd_…), or under /leaderboards a Mirage leaderboard (lbd_…).

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/boards/{boardId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  board: {
    boardId: string
    name: string
    description: null | string
    emoji: null | string
    metric: string
    period: string
    seasonId: null | string
    from: null | string
    to: null | string
    groupBy: "role" | "member" | "car"
    roleIds: string[]
    models: string[]
    tripClasses: string[]
    minimum: null | number
    circuitId: null | string
    top: number
    anonymous: boolean
    channelId: null | string
    announce: boolean
    position: number
    createdAt: number
  }
  period: {
    label: string
    from: null | string
    to: null | string
    offset: number
    key: null | string
  }
  standings: null | {
    rows: {
      rank: number
      value: number
      display: string
      subject: {
        kind: "role" | "member" | "car"
        key: string
        name: string
        avatarUrl: null | string
        anonymous: boolean
        me: boolean
        car: null | {
          name: string
          model: null | string
        }
        color: null | string
      }
      ids?: {
        userId?: string
        vehicleId?: string
        roleId?: string
      }
    }[]
    me: null | {
      rank: number
      value: number
      display: string
      subject: {
        kind: "role" | "member" | "car"
        key: string
        name: string
        avatarUrl: null | string
        anonymous: boolean
        me: boolean
        car: null | {
          name: string
          model: null | string
        }
        color: null | string
      }
      ids?: {
        userId?: string
        vehicleId?: string
        roleId?: string
      }
    }
    participants: number
    ranked: number
    computedAt: number
  }
  metric: {
    label: string
    unit: string
    better: string
    estimated: boolean
    circuitOnly: boolean
  }
}
GET/v1/messaging/servers/:serverId/leaderboards/boards/:boardId/results

A board's finished periods, newest first: each one's standings as it ended.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • boardId

    Board id: a Tasks board (brd_…), or under /leaderboards a Mirage leaderboard (lbd_…).

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/boards/{boardId}/results' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  results: {
    period: string
    label: string
    standings: unknown
    finishedAt: number
  }[]
}
PATCH/v1/messaging/servers/:serverId/leaderboards/boards/:boardId

Changes a board (the fields of making one; null clears an optional one). The same safety rule applies. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • boardId

    Board id: a Tasks board (brd_…), or under /leaderboards a Mirage leaderboard (lbd_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/boards/{boardId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  board: {
    boardId: string
    name: string
    description: null | string
    emoji: null | string
    metric: string
    period: string
    seasonId: null | string
    from: null | string
    to: null | string
    groupBy: "role" | "member" | "car"
    roleIds: string[]
    models: string[]
    tripClasses: string[]
    minimum: null | number
    circuitId: null | string
    top: number
    anonymous: boolean
    channelId: null | string
    announce: boolean
    position: number
    createdAt: number
  }
}
DELETE/v1/messaging/servers/:serverId/leaderboards/boards/:boardId

Deletes a board. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • boardId

    Board id: a Tasks board (brd_…), or under /leaderboards a Mirage leaderboard (lbd_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/boards/{boardId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/messaging/servers/:serverId/leaderboards/drives

Your recent drives of one of your cars (vehicleId), newest first, to make a course from: when, how far, whether each has a route. Private drives aren't listed. For people who may make courses.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Query parameters

  • vehicleIdstring

Errors

  • 400Name the car (vehicleId).
  • 403Mirage is only for the person signed in.
  • 403Only people who manage the server can make courses here.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/drives' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  drives: {
    tripId: string
    startedAt: number
    endedAt: number
    km: null | number
    hasTrack: boolean
  }[]
}
GET/v1/messaging/servers/:serverId/leaderboards/drives/:vehicleId/:tripId

One of your own drives' route (simplified), to choose a stretch of for a course (startedAt: when it started, from the list). Yours alone.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • vehicleId

    A vehicle's id (veh_…): one owner's period with one VIN. Another owner of the same car has another id.

  • tripId

    A drive's id (drv_…), as the drives list gives it.

Query parameters

  • startedAtstring

Errors

  • 400Say when the drive started (startedAt).
  • 403Mirage is only for the person signed in.
  • 403Only people who manage the server can make courses here.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/drives/{vehicleId}/{tripId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  tripId: string
  startedAt: number
  km: null | number
  route: [number, number][]
}
POST/v1/messaging/servers/:serverId/leaderboards/courses

Makes a course: name, rankBy (efficiency, smoothness or efforts; time and topSpeed only for a course wholly inside a closed circuit), and either path ([lat, lon] points drawn or typed) or a stretch of your own drive (vehicleId, tripId, startedAt, fromKm, toKm). Entered cars' drives from the last 30 days are matched against it. Manage Server, or any member where the server allows it.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 400Pick the stretch of the drive (fromKm, toKm).
  • 403Mirage is only for the person signed in.
  • 403Only people who manage the server can make courses here.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/courses' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  course: {
    courseId: string
    name: string
    description: null | string
    emoji: null | string
    path: [number, number][]
    km: number
    loop: boolean
    rankBy: "time" | "efficiency" | "topSpeed" | "efforts" | "smoothness"
    circuitId: null | string
    circuitName: null | string
    source: "drive" | "points" | "drawn"
    createdAt: number
  }
}
POST/v1/messaging/servers/:serverId/leaderboards/courses/snap

Puts a drawn route on the roads: path (2 to 501 [lat, lon] points). Returns path and snapped; where no road matches closely, or snapping isn't available (reason: no_match, no_token, error), the route as sent. Up to 60 an hour a person. Whoever may make courses here.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/courses/snap' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  path: [number, number][]
  snapped: boolean
  reason?: "error" | "no_match" | "no_token"
}
POST/v1/messaging/servers/:serverId/leaderboards/courses/preview

Which of your own drives from the last 30 days would count on a drawn route: path (2 to 501 [lat, lon] points). Returns checked (drives read, at most 20) and matches (each car, when, distance, smoothness, efficiency and the stretch; never a time or speed). Only yours. Up to 30 an hour a person. Whoever may make courses here.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/courses/preview' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  checked: number
  matches: {
    vehicleId: string
    car: string
    startedAt: number
    km: number
    smoothness: number
    whPerKm?: number
    path: [number, number][]
  }[]
}
GET/v1/messaging/servers/:serverId/leaderboards/courses/:courseId

A course (its route), its standings for a period (all, season, year, month, week; offset for earlier ones), best effort per person, and your own efforts. Road courses keep no times.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • courseId

    A Mirage leaderboard course id (lcr_…).

Query parameters

  • periodstring

    Default "all".

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/courses/{courseId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  course: {
    courseId: string
    name: string
    description: null | string
    emoji: null | string
    path: [number, number][]
    km: number
    loop: boolean
    rankBy: "time" | "efficiency" | "topSpeed" | "efforts" | "smoothness"
    circuitId: null | string
    circuitName: null | string
    source: "drive" | "points" | "drawn"
    createdAt: number
  }
  period: {
    period: "all" | "month" | "year" | "week" | "season"
    label: string
    from: null | string
    to: null | string
  }
  rows: {
    rank: number
    value: number
    display: string
    efforts: number
    person: {
      userId: string
      name: string
      avatarUrl: null | string
      anonymous: boolean
      me: boolean
    }
  }[]
  me: null | {
    rank: number
    value: number
    display: string
    efforts: number
    person: {
      userId: string
      name: string
      avatarUrl: null | string
      anonymous: boolean
      me: boolean
    }
  }
  myEfforts: {
    elapsedMs?: null | number
    topSpeedKmh?: null | number
    day: string
    km: number
    whPerKm: null | number
    smoothness: number
  }[]
}
PATCH/v1/messaging/servers/:serverId/leaderboards/courses/:courseId

Renames a course or changes how it ranks (the safety rule applies). Its maker or Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • courseId

    A Mirage leaderboard course id (lcr_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/courses/{courseId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  course: {
    courseId: string
    name: string
    description: null | string
    emoji: null | string
    path: [number, number][]
    km: number
    loop: boolean
    rankBy: "time" | "efficiency" | "topSpeed" | "efforts" | "smoothness"
    circuitId: null | string
    circuitName: null | string
    source: "drive" | "points" | "drawn"
    createdAt: number
  }
}
DELETE/v1/messaging/servers/:serverId/leaderboards/courses/:courseId

Deletes a course. Its maker or Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • courseId

    A Mirage leaderboard course id (lcr_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/courses/{courseId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/servers/:serverId/leaderboards/seasons

Makes a season: name, from and to (local days, inclusive, at most 400 days), optional emoji. Season boards rank over it. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/seasons' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  season: {
    seasonId: string
    name: string
    emoji: null | string
    from: string
    to: string
  }
}
PATCH/v1/messaging/servers/:serverId/leaderboards/seasons/:seasonId

Changes a season's name, emoji or dates. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • seasonId

    A Mirage leaderboard season id (lss_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/seasons/{seasonId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  season: {
    seasonId: string
    name: string
    emoji: null | string
    from: string
    to: string
  }
}
DELETE/v1/messaging/servers/:serverId/leaderboards/seasons/:seasonId

Deletes a season. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • seasonId

    A Mirage leaderboard season id (lss_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/seasons/{seasonId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/servers/:serverId/leaderboards/badges

Makes a badge: name, emoji, optional color and description, and a rule: { kind: rank, boardId, top } (a top place when a board's period ends), { kind: threshold, metric, value, period } (a total reached in a month, year, season or all time; road metrics only), { kind: course, courseId, efforts }, or { kind: manual }. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/badges' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  badge: {
    badgeId: string
    name: string
    emoji: string
    color: null | string
    description: null | string
    rule: {
      kind: "rank"
      boardId: string
      top: number
    } | {
      kind: "threshold"
      metric: string
      value: number
      period: "all" | "month" | "year" | "season"
    } | {
      kind: "course"
      courseId: string
      efforts: number
    } | {
      kind: "manual"
    }
  }
}
PATCH/v1/messaging/servers/:serverId/leaderboards/badges/:badgeId

Changes a badge. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • badgeId

    A Mirage leaderboard badge id (lbg_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X PATCH 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/badges/{badgeId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  badge: {
    badgeId: string
    name: string
    emoji: string
    color: null | string
    description: null | string
    rule: {
      kind: "rank"
      boardId: string
      top: number
    } | {
      kind: "threshold"
      metric: string
      value: number
      period: "all" | "month" | "year" | "season"
    } | {
      kind: "course"
      courseId: string
      efforts: number
    } | {
      kind: "manual"
    }
  }
}
DELETE/v1/messaging/servers/:serverId/leaderboards/badges/:badgeId

Deletes a badge and its awards. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • badgeId

    A Mirage leaderboard badge id (lbg_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/badges/{badgeId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/servers/:serverId/leaderboards/badges/:badgeId/awards

Gives a hand-awarded badge to a member (userId, optional note). Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • badgeId

    A Mirage leaderboard badge id (lbg_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/badges/{badgeId}/awards' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  awardKey: string
}
DELETE/v1/messaging/servers/:serverId/leaderboards/badges/:badgeId/awards/:userId/:awardKey

Takes an award back. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • badgeId

    A Mirage leaderboard badge id (lbg_…).

  • userId

    A member's user id (usr_…).

  • awardKey

    What an award was for: the board and period, the course, or hand:<time> for one given by hand.

Errors

  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/badges/{badgeId}/awards/{userId}/{awardKey}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/messaging/servers/:serverId/leaderboards/leagues

Makes a league between servers: name, metric (a road metric), period (week, month, year, all), aggregate (total or average of members), optional emoji. Its code (for other servers to join with) is shown to its host. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/leagues' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 201

{
  league: {
    code?: string
    leagueId: string
    name: string
    emoji: null | string
    metric: string
    period: string
    aggregate: "total" | "average"
    servers: number
    host: boolean
  }
}
POST/v1/messaging/servers/:serverId/leaderboards/leagues/join

Joins a league with its code, as this server (up to 20 servers a league). Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X POST 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/leagues/join' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  league: {
    code?: string
    leagueId: string
    name: string
    emoji: null | string
    metric: string
    period: string
    aggregate: "total" | "average"
    servers: number
    host: boolean
  }
}
GET/v1/messaging/servers/:serverId/leaderboards/leagues/:leagueId

A league's standings: each server's score from its taking-part members, with names and icons; never anyone in them.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • leagueId

    A Mirage league id (lgu_…).

Errors

  • 403Mirage is only for the person signed in.
curl 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/leagues/{leagueId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  league: {
    code?: string
    leagueId: string
    name: string
    emoji: null | string
    metric: string
    period: string
    aggregate: "total" | "average"
    servers: number
    host: boolean
  }
  period: {
    label: string
    from: null | string
    to: null | string
  }
  rows: {
    rank: number
    value: number
    display: string
    server: {
      serverId: string
      name: string
      icon: null | string
      people: number
      mine: boolean
    }
  }[]
  unranked: {
    serverId: string
    name: string
    icon: null | string
    people: number
    mine: boolean
  }[]
}
DELETE/v1/messaging/servers/:serverId/leaderboards/leagues/:leagueId

Leaves a league; its host leaving ends it. Manage Server.

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

Path parameters

  • serverId

    Mirage server id (gld_…).

  • leagueId

    A Mirage league id (lgu_…).

Errors

  • 403Mirage is only for the person signed in.
curl -X DELETE 'https://api.cactive.com.au/v1/messaging/servers/{serverId}/leaderboards/leagues/{leagueId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body