Developers · Node.js

A meeting bot in Node.js: join a meeting in twenty lines

A Node.js program that joins a meeting and reports who is in it, with what it printed when it was run.

Ran on 10 November 2026Language Node.jsJob Join a meeting

What it does

The smallest useful bot: it connects, says who it is, and reports who is in the room. Everything a bigger bot does starts from the agent-ready message this one waits for.

It needs a key and a meeting code in MEETFUL_KEY and MEETING. Two curl requests make both. MEETFUL_URL is optional and defaults to https://meetful.com.

Node 22 or later. WebSocket and fetch are built into Node from version 22, so there is nothing to install.

The code

// Join a Meetful meeting as a bot. Node 22 or later: WebSocket is built in, nothing to install.
// MEETFUL_KEY=tmk_… MEETING=abc-defg-hij node join.mjs
const base = process.env.MEETFUL_URL || 'https://meetful.com';
const ws = new WebSocket(base.replace(/^http/, 'ws'));

ws.addEventListener('open', () => {
  ws.send(JSON.stringify({ type: 'agent-hello', key: process.env.MEETFUL_KEY, meeting: process.env.MEETING }));
});

ws.addEventListener('message', ({ data }) => {
  const m = JSON.parse(data);
  if (m.type === 'agent-ready') {
    const people = m.members.filter(x => x.kind === 'person').map(x => x.name);
    console.log(`In ${m.meeting} as ${m.you.emoji} ${m.you.name}. People here: ${people.join(', ') || 'nobody yet'}.`);
    console.log(`It may: ${m.can.join(', ')}`);
    ws.close();
  }
  if (m.type === 'agent-refused') {
    console.error('Refused:', m.why);
    ws.close();
  }
});

Run it

MEETFUL_KEY=tmk_… MEETING=abc-defg-hij node join.mjs

What it printed

In iuq-qwbn-dtp as 🤖 node bot. People here: Dana, Sam.
It may: say, chat, draw, note

Run on 10 November 2026 against a Meetful server built from the same code as meetful.com, with two people — Dana and Sam — in the meeting saying three lines. Nothing above was edited.

How it works

Node 22 gave the global WebSocket the same shape as the browser's: addEventListener, a message event with the text in data, and send. So the code would also run in a browser tab, apart from reading the key from process.env.

agent-ready carries more than the members: the meeting's mode, the transcript so far, and can — the list of things this key may do in the room. A bot that reads can before it acts never sends something the room will refuse.

What can go wrong

Refused: no such key — mint one with POST /api/keys

The key is wrong, or was never minted on this server. A key from one Meetful server does not work on another.

Refused: no such meeting

The meeting code is not one that is open. A meeting that has ended, or a code with a typo, gives this.

ReferenceError: WebSocket is not defined

Node older than 22. Upgrade, or npm install ws and import WebSocket from it; the rest of the code is the same.

Next

In Node.js: live transcript · speak · get the transcript

The same in Python · Go

The whole API · Every socket message and webhook · All guides

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.