Skip to main content
The BlueBubbles Server can operate in two modes: a standard mode driven by AppleScript automation, and an enhanced mode that uses a private macOS framework to communicate directly with the Messages app at a lower level. This lower-level integration is called the Private API. It unlocks a set of features that AppleScript simply cannot reach — reactions, typing indicators, group management, and more — but it requires explicit opt-in on the server side before your SDK calls can use them.
The Private API features described on this page only work when Private API mode is enabled in your BlueBubbles Server settings. If the server does not have Private API enabled, calls to Private API-backed methods will fail or silently fall back to standard behavior. Enable it in the BlueBubbles Server app under Settings → Private API.

What the Private API unlocks

The following features are only available when the Private API is active on the server:

Sending with method: "private-api"

When you call client.messages.sendText(), the server uses AppleScript by default. To explicitly route the send through the Private API — which enables richer features and better reliability — pass method: "private-api" in the request body.
Some parameters automatically force the Private API even without setting method explicitly. These are:
  • subject — attaches a subject line to the message
  • effectId — sends the message with an iMessage effect (e.g., balloons, confetti)
  • selectedMessageGuid — sends the message as a reply to a specific prior message

Sending reactions

Reactions (tapbacks) are exclusively a Private API feature. Provide the chatGuid, the GUID of the message you’re reacting to, and one of the supported reaction strings.
Valid reaction values: Prefix the reaction name with - to remove a previously sent tapback.

Managing group participants

Adding and removing participants from a group chat both require the Private API. Include the participant’s phone number or email address (with country code for phone numbers).
Include the country code when specifying phone number addresses. For US numbers, prefix with 1 — for example, +15550005678.

Typing indicators

You can show and hide the typing indicator in a conversation. The indicator automatically clears when a message is sent to that chat.

Creating a new chat

Creating a new iMessage conversation requires the Private API. Pass an array of participant addresses and an optional opening message.

Marking chats as read and unread

1

Mark as read

Calling markRead marks the chat as read on the macOS server and notifies other BlueBubbles clients to update their unread state.
2

Mark as unread

Calling markChatAsUnread marks the chat as unread. On macOS Ventura and later, this also updates the unread state for other Apple devices signed into the same account. On earlier macOS versions, the event is dispatched to BlueBubbles clients only.
markChatAsUnread requires macOS Ventura or later for the change to propagate to iOS devices. On earlier macOS versions, only BlueBubbles clients will reflect the unread state.

Minimum server version requirements

Some Private API features require a specific minimum version of the BlueBubbles Server:
You can check the running server version at any time by calling await client.server.getServerMetadata() and inspecting the version field in the response.