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.
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/keysThe key is wrong, or was never minted on this server. A key from one Meetful server does not work on another.
Refused: no such meetingThe 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 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.