Use this file to discover all available pages before exploring further.
im.polls manages iMessage poll messages. A poll always belongs to a chat, so create(...) takes chat.guid. If you only have email addresses or phone numbers, create the chat first with im.chats.create(...).After a poll is created, store poll.pollMessageGuid. You need it to read the poll, vote, unvote, add options, and subscribe to events for that poll.
Returns the updated Poll. The new option is appended to options.
Input
Rule
pollMessageGuid
Existing poll message GUID
text
Trimmed by the SDK/server; must not be empty after trimming
Missing polls throw NotFoundError.
create(...), vote(...), unvote(...), and addOption(...) accept optional { clientMessageId } for idempotent retries from your job system. Most direct calls can omit it. See error handling for details.
subscribeEvents(...) returns TypedEventStream<PollEvent>. Use the stream to observe changes made by other people, other devices, or another part of your system. Immediately after your code calls vote(...), unvote(...), or addOption(...), use that method’s returned Poll.
Every poll event has type: "poll.changed". The outer fields answer which poll changed, which chat it belongs to, who triggered it, and when:
{ "type": "poll.changed", // Fixed value for poll change events "pollMessageGuid": "poll-message-guid", // Poll message GUID that changed "chatGuid": "any;+;group-id", // Chat that contains the poll "sequence": 123, // Event sequence for ordering and catch-up "isFromMe": false, // Triggered by the current account "occurredAt": "2026-01-01T12:00:00Z", // Event time "actor": { // Participant that triggered the event; may be absent "address": "alice@example.com", "service": "iMessage" }, "delta": { // The actual poll change "type": "voted", "optionIdentifier": "option-1" }}
event.delta.type tells you what changed. Each type carries different fields:
event.delta.type
Meaning
Extra fields
created
The poll was created
title, options
optionAdded
A new option was appended
title, options
voted
A participant voted or changed their vote
optionIdentifier
unvoted
A participant removed their vote
optionIdentifier
{ "type": "created", // Poll was created "title": "Lunch?", // Current title "options": [ // Full option list { "optionIdentifier": "option-1", "text": "Pizza" } ]}
Switch on event.delta.type. When you subscribe to one poll, you do not need to check pollMessageGuid again:
for await (const event of im.polls.subscribeEvents({ pollMessage: poll.pollMessageGuid,})) { switch (event.delta.type) { case "created": case "optionAdded": console.log(event.delta.title, event.delta.options); break; case "voted": case "unvoted": console.log(event.delta.optionIdentifier); break; }}
When you subscribe to all visible polls, use event.pollMessageGuid to identify the poll:
for await (const event of im.polls.subscribeEvents()) { console.log(event.pollMessageGuid, event.delta.type);}
If the stream disconnects, use events to catch up on missed durable events, then continue consuming the live stream.