Developers · Python

A meeting bot in Python: join a meeting with websockets

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

Ran on 10 November 2026Language PythonJob Join a meeting

What it does

A Python bot that joins a Meetful meeting, prints who is there, and leaves. It uses asyncio and the websockets package, the usual pair for a socket client in Python.

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.

Python 3.9 or later. The socket scripts use the websockets package (pip install websockets; this ran with 13.1); the transcript script uses only the standard library.

The code

# Join a Meetful meeting as a bot from Python. pip install websockets
# MEETFUL_KEY=tmk_… MEETING=abc-defg-hij python join.py
import asyncio, json, os
import websockets

BASE = os.environ.get("MEETFUL_URL", "https://meetful.com")

async def main():
    async with websockets.connect(BASE.replace("http", "ws", 1)) as ws:
        await ws.send(json.dumps({"type": "agent-hello", "key": os.environ["MEETFUL_KEY"], "meeting": os.environ["MEETING"]}))
        async for raw in ws:
            m = json.loads(raw)
            if m["type"] == "agent-ready":
                people = [x["name"] for x in m["members"] if x["kind"] == "person"]
                print(f"In {m['meeting']} as {m['you']['emoji']} {m['you']['name']}. People here: {', '.join(people) or 'nobody yet'}.")
                print("It may:", ", ".join(m["can"]))
                return
            if m["type"] == "agent-refused":
                raise SystemExit("Refused: " + m["why"])

asyncio.run(main())

Run it

MEETFUL_KEY=tmk_… MEETING=abc-defg-hij python join.py

What it printed

In jho-bwva-mia as 🤖 python 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

async for over the connection yields each message as a string; json.loads turns it into a dict. Returning from main closes the socket cleanly, because the connection was opened with async with.

websockets.connect takes the wss:// address directly. The code builds it from MEETFUL_URL by swapping http for ws, so the same script works against meetful.com and against a server of your own.

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.

ModuleNotFoundError: No module named 'websockets'

pip install websockets, in the same environment the script runs in.

Next

In Python: live transcript · speak · get the transcript

The same in Node.js · 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.