Skip to main content
im.groups covers iMessage group-only operations: display names, participants, group icons, leaving, and group events. Group methods use the group chat’s chat.guid. If you only have email addresses or phone numbers, create the group first with im.chats.create(...). Direct chats cannot use group APIs. Shared chat features, such as chat creation, read state, typing, and chat backgrounds, are documented under chats.

What You Can Do

Group Chat GUIDs

Except for subscribeEvents(...), which takes an optional { chat } filter, group methods take the group chat.guid as their first argument. Create or fetch a group chat first:
Then pass group.guid to group operations:
Group chat GUIDs usually look like any;+;group-id. Do not pass email addresses, phone numbers, or direct-chat GUIDs to group methods.

Rename

Returns the updated Chat. The display name is trimmed and must not be empty after trimming.

Add Participants

Returns the updated Chat. The server rejects duplicate addresses, addresses that are already in the group, and addresses it cannot resolve.

Remove Participants

Returns the updated Chat. Removing participants usually requires the current account to have permission to manage the group. The server rejects unknown addresses, duplicate addresses, and removals the current account is not allowed to perform.

Group Icons

Group icons use raw image bytes. They are not attachment GUIDs, and you do not upload them through im.attachments first.

Set an Icon

Returns void. data must not be empty. The server detects the image type from the bytes. PNG, JPEG, GIF, HEIC, and HEIF are supported.

Download an Icon

Returns GroupIcon:
When no custom icon exists, getIcon(...) throws NotFoundError, with error.code === ErrorCode.groupIconNotFound.

Remove an Icon

Returns void. Removing an icon is safe to repeat, even when no custom icon is set.

Leave a Group

Returns void.
leave(...) makes the current account leave the group. It cannot rejoin by itself; another participant must invite it again.
Group write methods accept optional { clientMessageId } for idempotent retries from your job system. Most direct calls can omit it. See error handling for details.

Group Events

subscribeEvents(...) returns TypedEventStream<GroupEvent>. Use the stream to observe changes made by other people, other devices, or another part of your system. Immediately after your code calls a write method, use that method’s Chat result or completion status.

Scope

Only one group:
All visible group events:

Outer Event

Every group event has type: "group.changed". The outer fields answer which group changed, who triggered it, and when:

Change Types

event.change.type tells you what changed. Each type carries different fields:

Handle Events

Switch on event.change.type. When you subscribe to one group, you do not need to check chatGuid again:
When you subscribe to all visible groups, use event.chatGuid to identify the group:
If the stream disconnects, use events to catch up on missed durable events, then continue consuming the live stream.

Next Steps

  1. Chats — create a group chat and get chat.guid
  2. Messages — send messages, attachments, and reactions in a group chat
  3. Events — catch up on durable events after a disconnect
  4. Error Handling — handle NotFoundError, ValidationError, and idempotent retries