Skip to content
Download Beeper

Notify anyway

client.chats.notifyAnyway(stringchatID, ChatNotifyAnywayParamsbody?, RequestOptionsoptions?): Chat { id, accountID, network, 21 more }
POST/v1/chats/{chatID}/notify-anyway

Force a delivery notification when supported by the underlying network. Currently intended for iMessage on macOS; unsupported networks return an error.

ParametersExpand Collapse
chatID: string

Chat ID. Input routes also accept the local chat ID from this Beeper Desktop installation when available.

body: ChatNotifyAnywayParams
ReturnsExpand Collapse
Chat { id, accountID, network, 21 more }
id: string

Unique identifier of the chat across Beeper.

accountID: string

Account ID this chat belongs to.

network: string

Display-only human-readable account/network name.

participants: Participants { hasMore, items, total }

Chat participants information.

hasMore: boolean

True if there are more participants than included in items.

items: Array<Item>

Participants returned for this chat (limited by the request; may be a subset).

isAdmin?: boolean

True if this participant has admin privileges in the chat.

isNetworkBot?: boolean

True if this participant represents a network or bridge bot.

isPending?: boolean

True if this participant has been invited but has not joined yet.

total: number

Total number of participants in the chat.

title: string

Display title of the chat as computed by the client/server.

type: "single" | "group"

Chat type: ‘single’ for direct messages, ‘group’ for group chats.

One of the following:
"single"
"group"
unreadCount: number

Number of unread messages.

capabilities?: Capabilities { allowedReactions, archive, attachments, 24 more }

Chat capabilities reported by the platform.

allowedReactions?: Array<string>

Allowed Unicode reactions. Omitted means all emoji reactions are allowed.

archive?: boolean

True if archive/unarchive is supported.

attachments?: Record<string, Attachments>

Supported attachment message types and their per-type constraints, keyed by Matrix msgtype or pseudo-msgtype (for example m.image, m.video, org.matrix.msc3245.voice). Missing message types should be treated as rejected.

mimeTypes: Record<string, -2 | -1 | 0 | 2 more>

Supported MIME types or MIME patterns for this file message type. Missing MIME types should be treated as rejected.

One of the following:
-2
-1
0
1
2
caption?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
maxCaptionLength?: number

Maximum caption length when captions are supported.

maxDuration?: number

Maximum audio or video duration in seconds.

maxHeight?: number

Maximum image or video height in pixels.

maxSize?: number

Maximum file size in bytes.

maxWidth?: number

Maximum image or video width in pixels.

viewOnce?: boolean

True if this file type can be sent as view-once media.

customEmojiReactions?: boolean

True if custom emoji reactions are supported.

delete?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
deleteChat?: boolean

True if deleting chats for the authenticated user is supported.

deleteChatForEveryone?: boolean

True if deleting chats for everyone is supported.

deleteForMe?: boolean

True if deleting messages only for the authenticated user is supported.

deleteMaxAge?: number

Maximum message age for delete-for-everyone, in seconds.

disappearingTimer?: DisappearingTimer { omitEmptyTimer, timers, types }

Disappearing-message timer capabilities.

omitEmptyTimer?: boolean

True if empty timer objects should be omitted from message content.

timers?: Array<number>

Allowed disappearing timer values in milliseconds. Omitted means any timer is allowed.

types?: Array<"afterRead" | "afterSend">

Supported disappearing timer types.

One of the following:
"afterRead"
"afterSend"
edit?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
editMaxAge?: number

Maximum message age for edits, in seconds.

editMaxCount?: number

Maximum number of edits allowed for one message.

formatting?: Record<string, -2 | -1 | 0 | 2 more>

Supported rich-text formatting features keyed by feature name (for example bold, inline_code, code_block.syntax_highlighting). Omitted means no formatting support is advertised.

One of the following:
-2
-1
0
1
2
locationMessage?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
markAsUnread?: boolean

True if marking chats unread is supported.

maxTextLength?: number

Maximum length of normal text messages.

messageRequest?: MessageRequest { acceptWithButton, acceptWithMessage }

Message request capabilities.

acceptWithButton?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
acceptWithMessage?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
participantActions?: ParticipantActions { ban, invite, kick, 2 more }

Participant management capabilities.

ban?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
invite?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
kick?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
leave?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
revokeInvite?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
poll?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
reaction?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
reactionCount?: number

Maximum number of reactions allowed on a single message.

readReceipts?: boolean

True if read receipts are supported.

reply?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
state?: State { avatar, description, disappearingTimer, title }

Chat state update capabilities.

avatar?: Avatar { level }

Chat avatar state capability.

level: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
description?: Description { level }

Chat description/topic state capability.

level: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
disappearingTimer?: DisappearingTimer { level }

Disappearing-message timer state capability.

level: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
title?: Title { level }

Chat title state capability.

level: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
thread?: -2 | -1 | 0 | 2 more

-2: rejected, -1: dropped, 0: unsupported, 1: partially supported, 2: fully supported.

One of the following:
-2
-1
0
1
2
typingNotifications?: boolean

True if typing notifications are supported.

description?: string | null

Group chat description/topic when available.

draft?: Draft | null

Current draft object for this chat, or null when no draft is set.

text: string

Matrix HTML draft body.

attachments?: Record<string, Attachments>

Draft attachments keyed by attachment ID.

id: string

Draft attachment identifier.

type: "file" | "gif" | "recorded_audio"

Draft attachment type. GIF and recorded audio are mutually exclusive types.

One of the following:
"file"
"gif"
"recorded_audio"
audioDurationSeconds?: number

Audio duration in seconds if known.

fileName?: string

Original filename if available.

filePath?: string

Local filesystem path for the draft attachment.

fileSize?: number

File size in bytes if known.

mimeType?: string

MIME type if known.

size?: Size { height, width }

Pixel dimensions of the attachment.

height?: number
width?: number
stickerID?: string

Sticker identifier if the draft attachment is a sticker.

imgURL?: string | null

Local filesystem path to the chat avatar image when available.

isArchived?: boolean

True if chat is archived.

isLowPriority?: boolean

True if chat is marked low priority.

isMarkedUnread?: boolean

True if the chat was explicitly marked unread by the authenticated user.

isMuted?: boolean

True if chat notifications are muted.

isPinned?: boolean

True if chat is pinned.

isReadOnly?: boolean

True if messages cannot be sent in this chat.

lastActivity?: string

Timestamp of last activity.

formatdate-time
lastReadMessageSortKey?: string

Last read message sortKey.

localChatID?: string | null

Local chat ID specific to this Beeper Desktop installation.

messageExpirySeconds?: number | null

Disappearing-message timer in seconds when available.

reminder?: Reminder | null

Current reminder for this chat, or null when no reminder is set.

dismissOnIncomingMessage?: boolean

Cancel reminder if someone messages in the chat.

remindAt?: string

Timestamp when the reminder should trigger.

formatdate-time
snooze?: Snooze | null

Current snooze state for this chat, or null when no snooze is set.

snoozeUntil?: string

Timestamp when the snooze expires.

formatdate-time
userSnoozedAt?: string

Timestamp when the user set the snooze.

formatdate-time
unreadMentionsCount?: number

Number of unread messages that mention the authenticated user or @room.

Notify anyway

import BeeperDesktop from '@beeper/desktop-api';

const client = new BeeperDesktop({
  accessToken: process.env['BEEPER_ACCESS_TOKEN'], // This is the default and can be omitted
});

const chat = await client.chats.notifyAnyway('!NCdzlIaMjZUmvmvyHU:beeper.com');

console.log(chat.id);
{
  "id": "!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost",
  "accountID": "local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc",
  "network": "WhatsApp",
  "participants": {
    "hasMore": false,
    "items": [
      {
        "id": "@15550101002:local-whatsapp.localhost",
        "cannotMessage": false,
        "email": "email",
        "fullName": "Kishan Bagaria",
        "imgURL": "imgURL",
        "isSelf": false,
        "phoneNumber": "+15550101002",
        "username": "username",
        "isAdmin": true,
        "isNetworkBot": true,
        "isPending": true
      },
      {
        "id": "@ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc:local-whatsapp.localhost",
        "cannotMessage": false,
        "email": "email",
        "fullName": "Batuhan İçöz",
        "imgURL": "imgURL",
        "isSelf": true,
        "phoneNumber": "phoneNumber",
        "username": "username",
        "isAdmin": true,
        "isNetworkBot": true,
        "isPending": true
      }
    ],
    "total": 2
  },
  "title": "Kishan Bagaria",
  "type": "single",
  "unreadCount": 0,
  "capabilities": {
    "allowedReactions": [
      "string"
    ],
    "archive": true,
    "attachments": {
      "foo": {
        "mimeTypes": {
          "foo": -2
        },
        "caption": -2,
        "maxCaptionLength": 0,
        "maxDuration": 0,
        "maxHeight": 0,
        "maxSize": 0,
        "maxWidth": 0,
        "viewOnce": true
      }
    },
    "customEmojiReactions": true,
    "delete": -2,
    "deleteChat": true,
    "deleteChatForEveryone": true,
    "deleteForMe": true,
    "deleteMaxAge": 0,
    "disappearingTimer": {
      "omitEmptyTimer": true,
      "timers": [
        0
      ],
      "types": [
        "afterRead"
      ]
    },
    "edit": -2,
    "editMaxAge": 0,
    "editMaxCount": 0,
    "formatting": {
      "foo": -2
    },
    "locationMessage": -2,
    "markAsUnread": true,
    "maxTextLength": 0,
    "messageRequest": {
      "acceptWithButton": -2,
      "acceptWithMessage": -2
    },
    "participantActions": {
      "ban": -2,
      "invite": -2,
      "kick": -2,
      "leave": -2,
      "revokeInvite": -2
    },
    "poll": -2,
    "reaction": -2,
    "reactionCount": 0,
    "readReceipts": true,
    "reply": -2,
    "state": {
      "avatar": {
        "level": -2
      },
      "description": {
        "level": -2
      },
      "disappearingTimer": {
        "level": -2
      },
      "title": {
        "level": -2
      }
    },
    "thread": -2,
    "typingNotifications": true
  },
  "description": "description",
  "draft": {
    "text": "text",
    "attachments": {
      "foo": {
        "id": "id",
        "type": "file",
        "audioDurationSeconds": 0,
        "fileName": "fileName",
        "filePath": "filePath",
        "fileSize": 0,
        "mimeType": "mimeType",
        "size": {
          "height": 0,
          "width": 0
        },
        "stickerID": "stickerID"
      }
    }
  },
  "imgURL": "imgURL",
  "isArchived": false,
  "isLowPriority": true,
  "isMarkedUnread": true,
  "isMuted": false,
  "isPinned": false,
  "isReadOnly": true,
  "lastActivity": "2026-05-05T20:11:54.000Z",
  "lastReadMessageSortKey": "455171049984",
  "localChatID": "5639",
  "messageExpirySeconds": 0,
  "reminder": {
    "dismissOnIncomingMessage": true,
    "remindAt": "2025-08-31T23:30:12.520Z"
  },
  "snooze": {
    "snoozeUntil": "2025-08-31T23:30:12.520Z",
    "userSnoozedAt": "2025-08-31T23:30:12.520Z"
  },
  "unreadMentionsCount": 0
}
Returns Examples
{
  "id": "!whatsapp_15550101002:ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc.local-whatsapp.localhost",
  "accountID": "local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc",
  "network": "WhatsApp",
  "participants": {
    "hasMore": false,
    "items": [
      {
        "id": "@15550101002:local-whatsapp.localhost",
        "cannotMessage": false,
        "email": "email",
        "fullName": "Kishan Bagaria",
        "imgURL": "imgURL",
        "isSelf": false,
        "phoneNumber": "+15550101002",
        "username": "username",
        "isAdmin": true,
        "isNetworkBot": true,
        "isPending": true
      },
      {
        "id": "@ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc:local-whatsapp.localhost",
        "cannotMessage": false,
        "email": "email",
        "fullName": "Batuhan İçöz",
        "imgURL": "imgURL",
        "isSelf": true,
        "phoneNumber": "phoneNumber",
        "username": "username",
        "isAdmin": true,
        "isNetworkBot": true,
        "isPending": true
      }
    ],
    "total": 2
  },
  "title": "Kishan Bagaria",
  "type": "single",
  "unreadCount": 0,
  "capabilities": {
    "allowedReactions": [
      "string"
    ],
    "archive": true,
    "attachments": {
      "foo": {
        "mimeTypes": {
          "foo": -2
        },
        "caption": -2,
        "maxCaptionLength": 0,
        "maxDuration": 0,
        "maxHeight": 0,
        "maxSize": 0,
        "maxWidth": 0,
        "viewOnce": true
      }
    },
    "customEmojiReactions": true,
    "delete": -2,
    "deleteChat": true,
    "deleteChatForEveryone": true,
    "deleteForMe": true,
    "deleteMaxAge": 0,
    "disappearingTimer": {
      "omitEmptyTimer": true,
      "timers": [
        0
      ],
      "types": [
        "afterRead"
      ]
    },
    "edit": -2,
    "editMaxAge": 0,
    "editMaxCount": 0,
    "formatting": {
      "foo": -2
    },
    "locationMessage": -2,
    "markAsUnread": true,
    "maxTextLength": 0,
    "messageRequest": {
      "acceptWithButton": -2,
      "acceptWithMessage": -2
    },
    "participantActions": {
      "ban": -2,
      "invite": -2,
      "kick": -2,
      "leave": -2,
      "revokeInvite": -2
    },
    "poll": -2,
    "reaction": -2,
    "reactionCount": 0,
    "readReceipts": true,
    "reply": -2,
    "state": {
      "avatar": {
        "level": -2
      },
      "description": {
        "level": -2
      },
      "disappearingTimer": {
        "level": -2
      },
      "title": {
        "level": -2
      }
    },
    "thread": -2,
    "typingNotifications": true
  },
  "description": "description",
  "draft": {
    "text": "text",
    "attachments": {
      "foo": {
        "id": "id",
        "type": "file",
        "audioDurationSeconds": 0,
        "fileName": "fileName",
        "filePath": "filePath",
        "fileSize": 0,
        "mimeType": "mimeType",
        "size": {
          "height": 0,
          "width": 0
        },
        "stickerID": "stickerID"
      }
    }
  },
  "imgURL": "imgURL",
  "isArchived": false,
  "isLowPriority": true,
  "isMarkedUnread": true,
  "isMuted": false,
  "isPinned": false,
  "isReadOnly": true,
  "lastActivity": "2026-05-05T20:11:54.000Z",
  "lastReadMessageSortKey": "455171049984",
  "localChatID": "5639",
  "messageExpirySeconds": 0,
  "reminder": {
    "dismissOnIncomingMessage": true,
    "remindAt": "2025-08-31T23:30:12.520Z"
  },
  "snooze": {
    "snoozeUntil": "2025-08-31T23:30:12.520Z",
    "userSnoozedAt": "2025-08-31T23:30:12.520Z"
  },
  "unreadMentionsCount": 0
}