Developers · Node.js
Live meeting transcript in Node.js, a line at a time with who said it
A Node.js program that prints each line as it is said, with the speaker, with what it printed when it was run.
What it does
Each transcript message is one finished line: who said it, what they said and when. This program prints them as they arrive and leaves after a set number of seconds.
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
// Print every line said in a Meetful meeting, with the name of whoever said it, as it is said.
// MEETFUL_KEY=tmk_… MEETING=abc-defg-hij LISTEN_FOR=60 node listen.mjs
const base = process.env.MEETFUL_URL || 'https://meetful.com';
const listenFor = Number(process.env.LISTEN_FOR || 60) * 1000;
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') {
console.log(`listening in ${m.meeting}…`);
setTimeout(() => ws.close(), listenFor);
}
if (m.type === 'transcript') {
// The speaker is the microphone the words came in on: a fact, not a guess from mixed audio.
const at = new Date(m.line.at).toISOString().slice(11, 19);
console.log(`${at} ${m.line.speaker}: ${m.line.text}`);
}
if (m.type === 'agent-refused') { console.error('Refused:', m.why); ws.close(); }
});Run it
MEETFUL_KEY=tmk_… MEETING=abc-defg-hij node listen.mjs
What it printed
listening in iuq-qwbn-dtp…
14:16:51 Dana: Can we move the launch to the third of March?
14:16:51 Sam: Yes, if the docs are ready by the twentieth.
14:16:52 Dana: Then 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 speaker field is the name of the person whose microphone the line came from. Meetful transcribes every microphone on its own, so there is no diarisation step to trust or to correct, and two people talking over each other stay two lines.
The at field is milliseconds since 1970, in UTC; the program prints it as hours, minutes and seconds. A line arrives once, when its speaker pauses — there are no partial lines to stitch together.
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.
Nothing printed after "listening in…"Nobody has spoken yet, or the people in the meeting are muted. The socket stays open until LISTEN_FOR runs out.
Next
In Node.js: join a meeting · speak · get the transcript
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.