Developers · Node.js
Make a meeting bot speak, from Node.js
A Node.js program that says something in the meeting, with what it printed when it was run.
What it does
One say message after agent-ready, and the words are in the meeting: on the transcript under the bot's name, and read out loud where the server has a voice to read them with.
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
// Say something in a Meetful meeting from Node. The words go into the transcript under the bot's name,
// and are read out loud in the room where the server has a voice to read them with.
// MEETFUL_KEY=tmk_… MEETING=abc-defg-hij node speak.mjs "Noted: the launch moves to the third of March."
const base = process.env.MEETFUL_URL || 'https://meetful.com';
const text = process.argv[2] || 'Hello from Node.';
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') ws.send(JSON.stringify({ type: 'say', text }));
if (m.type === 'agent-said') {
console.log(`${m.by} said: ${m.text}${m.audio ? ' (read aloud)' : ''}`);
ws.close();
}
if (m.type === 'agent-error' || m.type === 'agent-refused') { console.error(m.type, m.why); ws.close(); }
});Run it
MEETFUL_KEY=tmk_… MEETING=abc-defg-hij node speak.mjs "Noted: the launch moves to the third of March, and Sam owns the docs."
What it printed
🤖 node bot said: Noted: the launch moves to the third of March, and Sam owns the docs.
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
The server answers with agent-said, which carries the text and an audio field. On the run below the audio was empty, because that server had no text-to-speech key; on a server with a voice it carries the spoken version, and the room plays it.
say is limited per key, like everything an agent sends. Send one line per thought; a bot that talks in long paragraphs is hard to follow in a meeting anyway.
What can go wrong
Refused: no such key — mint one with POST /api/keysThe key is wrong, or was never minted on this server. A key from one Meetful server does not work on another.
agent-error with a whySent too fast, or something this key may not do. The why says which; can in agent-ready lists what is allowed.
Next
In Node.js: join a meeting · live transcript · get the transcript
The same in Python · Go · curl
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.