Developers · Socket · you receive

state — the room changed

A message an agent receives on the WebSocket it uses to sit in a Meetful meeting. Whenever anything in the room changes: somebody joins or leaves, a chat message, the mode, the notes board, the recording starting or stopping.

When it arrives

Whenever anything in the room changes: somebody joins or leaves, a chat message, the mode, the notes board, the recording starting or stopping. In a busy meeting that can be several a second.

What is in it

FieldTypeWhat it is
state.idstringThe meeting code.
state.revnumberGoes up by one with every change, so you can drop one you have already seen.
state.membersarrayEveryone in the room with their role — an agent is always an "observer".
state.chatarrayThe whole chat.
state.board / recapobject | nullThe notes board and the recap, once there are any.
state.recordingobject | nullThe recording in progress, if any.
state.agentsAllowedbooleanFalse once the host turns agents off.

A real one

{
  "type": "state",
  "state": {
    "id": "edn-wopf-rnf",
    "rev": 10,
    "mode": "brainstorm",
    "stewardId": "dana",
    "agentsAllowed": true,
    "recording": null,
    "recap": null,
    "board": null,
    "locked": false,
    "members": [
      {
        "id": "dana",
        "name": "Dana",
        "kind": "person",
        "role": "decision-maker"
      },
      {
        "id": "sam",
        "name": "Sam",
        "kind": "person",
        "role": "decision-maker"
      },
      {
        "id": "ag_ZYpgxJIwAz",
        "name": "📝 Notetaker",
        "kind": "agent",
        "role": "observer"
      }
    ],
    "chat": [
      {
        "id": null,
        "name": null,
        "text": "📝 Notetaker noted: Launch moves to 3 March.",
        "at": 1794314424061,
        "kind": "note"
      },
      {
        "id": null,
        "name": null,
        "text": "📝 Notetaker: again",
        "at": 1794314424962,
        "kind": "system"
      }
    ]
  }
}

Captured from a test meeting on 10 November 2026: two people, Dana and Sam, typing lines, and an agent called Notetaker on the socket. The real message has about forty fields — polls, questions, hands, the agenda, presenters. Shown here: the ones an agent usually reads, with the members cut to four fields and the chat to its last two messages.

What to do with it

Most agents only need transcript and chat. Read state when you need the whole picture at once — who is here now, whether the notes board has something new, whether recording is on — and use rev to skip repeats.

It is large and frequent. If you only care about who is in the room, compare state.members with the last one you saw rather than reacting to every message.

On the socket

Connect to wss://meetful.com/ and introduce yourself with your key and the meeting code. Every message, both ways, is one JSON object with a type.

import WebSocket from 'ws';

const ws = new WebSocket('wss://meetful.com/');
ws.on('open', () => ws.send(JSON.stringify({ type: 'agent-hello', key: process.env.MEETFUL_KEY, meeting: 'abc-defg-hij' })));
ws.on('message', raw => {
  const m = JSON.parse(raw);
  if (m.type === 'state') console.log(m);
});

Goes with

Also: transcript · end · agent-error · agent-removed · say · note · draw · leave · Every event and message · The socket overview

Try Meetful

Meetings that take their own notes

Free video meetings in the browser: every line of the transcript under the name of who said it, and the summary and action items when you hang up. Nothing to install — guests just open the link.