Skip to main content

inspect-jitsi

Tools for inspecting a running Jitsi Meet deployment.

Installation

Install the inspect-jitsi command with pipx:

pipx install inspect-jitsi[cli]

Install as a Python module only:

pip install inspect-jitsi

Command Line API

The command line requires installing inspect-jitsi[cli].

First, join or leave the room at meet.hosted.quelltext.eu/inspect-jitsi. Then run the commands:

inspect-jitsi count https://meet.hosted.quelltext.eu/inspect-jitsi
inspect-jitsi participants https://meet.hosted.quelltext.eu/inspect-jitsi
inspect-jitsi diagnose https://meet.hosted.quelltext.eu/inspect-jitsi
inspect-jitsi created https://meet.hosted.quelltext.eu/inspect-jitsi
Command Prints Exit code
count <url> number of participants 0, or 1 on failure
participants <url> participants as indented JSON 0, or 1 on failure
diagnose <url> connectivity/auth report as indented JSON 0, or 1 on failure
created <url> nothing (use --json to print true/false) 0 if the room exists, 1 if not, 2 on failure

count/participants fall back to running diagnose and printing its report to stderr if they fail, to help explain why (e.g. a token being required).

Python API (Sync)

from inspect_jitsi import (
    get_participant_count,
    get_participants,
    diagnose_jitsi_access,
    is_room_created,
)

get_participant_count("https://meet.example.com/SomeRoomName")   # -> 2
get_participants("https://meet.example.com/SomeRoomName")        # -> [Participant(...), ...]
diagnose_jitsi_access("https://meet.example.com/SomeRoomName")   # -> DiagnosisResult(...)
is_room_created("https://meet.example.com/SomeRoomName")         # -> True
Function Returns
get_participant_count(url, nick=None, ...) int
get_participants(url, nick=None, ...) list[Participant]
diagnose_jitsi_access(url, ...) DiagnosisResult
is_room_created(url, ...) bool

Participant and DiagnosisResult are dataclasses with .to_dict() (and Participant also has .to_json()) for easy serialization. Participant carries jid, nick, name (display name, if disclosed), role, affiliation, real_jid, and occupant_id.

Python API (Async)

For anything beyond a single one-shot call - e.g. holding a room open and polling it repeatedly - use JitsiConference directly instead of the sync wrappers above; it's fully async/await:

import asyncio
from inspect_jitsi import JitsiConference

async def main():
    async with JitsiConference("https://meet.example.com/SomeRoomName") as conference:
        print(await conference.is_created())      # -> True, without joining
        print(await conference.get_participants())

asyncio.run(main())

How it works

We try joining the room as a participant and inspect who is there.

Jitsi's prosody deployment locks down disco#info on MUC rooms to occupants only (confirmed live: a bare disco#info query gets <error type="auth"><forbidden/></error>), so the usual XEP-0045 "peek without joining" trick doesn't work here. Instead, JitsiXmppConnection briefly joins the room as a real (if anonymous) occupant over an XMPP connection carried by WebSocket (the same wss://<domain>/xmpp-websocket endpoint the web client itself uses), reads the roster of <presence> stanzas the MUC sends back, then leaves - meaning the room briefly gains (and loses) one occupant, and other participants may see a transient join/leave notification.

No Python XMPP library (slixmpp, aioxmpp, ...) supports the WebSocket transport Jitsi requires - they're TCP-only, and Jitsi deployments generally don't expose raw XMPP client-to-server (port 5222) publicly - so inspect_jitsi.xmpp.connection hand-rolls the small slice of RFC 6120 (stream/SASL/bind) and RFC 7395 (XMPP over WebSocket framing) needed to join a MUC room.

jicofo (the conference focus component) also joins every active Jitsi conference's MUC as a pseudo-participant nicknamed focus - that occupant is filtered out so participant counts/lists reflect only humans.

Deployments (e.g. docker-jitsi-meet) commonly use an internal XMPP domain (typically meet.jitsi) and MUC component (typically muc.meet.jitsi) that differ from the public hostname in the URL - the public web server proxies the WebSocket through, but the XMPP stream's to attribute and the MUC room JID must use the internal names. discover_hosts figures these out automatically by reading the site's public /config.js (the same file the browser client itself relies on), rather than guessing.

Installing

pip install -e .          # Python API only
pip install -e ".[cli]"   # + the inspect-jitsi command line tool
pip install -e ".[test]"  # + test dependencies

Testing

pytest

Release

  1. Edit the changelog
  2. Create a tag and push it.
git tag v0.0.1
git push origin v0.0.1

Release files for inspect-jitsi 0.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for inspect-jitsi 0.0.2
File Size Uploaded
inspect_jitsi-0.0.2.tar.gz 39.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for inspect-jitsi 0.0.2
File Interpreter ABI Platform
inspect_jitsi-0.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 99.5 kB

Release files / inspect_jitsi-0.0.2.tar.gz

Download URL inspect_jitsi-0.0.2.tar.gz
Size 39.6 kB
Tags Source
SHA-256 checksum
How to use checksums
6836069e271b842a107b1b6c1e73cae4660795479278dd7df56ea304a53c8e2f
BLAKE2b-256 checksum
How to use checksums
97d77195be8a01ce2f069ee045bd86a5c6e828265bbaee3800cd3ca5e5996da5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.

Transparency log

Release files / inspect_jitsi-0.0.2-py3-none-any.whl

Download URL inspect_jitsi-0.0.2-py3-none-any.whl
Size 60.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d697315a22f7808acb785ebb5299214762d1354648bbd422e0db728ec2f497a6
BLAKE2b-256 checksum
How to use checksums
67378be6ac575cef40a7992cca42f5ec133bb62db5e747080aebaebef0fdaf86
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.0

2 release files

0.1.0

2 release files

This release

0.0.2 This release

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page