pyedookit
Unofficial async Python client for the Edookit parent portal
(https://<school>.edookit.net), used by Czech schools. Built for the
ha-edookit Home Assistant integration but usable standalone.
Edookit's official REST API exists but is only enabled per-school by an administrator, so this library works the way a parent actually does: it logs in through Plus4U (OIDC) and scrapes the portal's server-rendered pages. There is no vendor support for this - selectors may break when Edookit changes its markup.
Status
v0.3.0 - timetable, upcoming school events and payments. Verified end-to-end against a real portal (login, session-settling after the OIDC callback, and the timetable parser all confirmed working on real data).
Only week_offset=0 (the current week) is confirmed working. The
portal accepts week_offset=1 ("next week") without error, but returns the
same week's data back rather than actually advancing - the real
week-navigation parameter hasn't been identified yet. Since a school's
weekly timetable is typically the same all year, current-week-only is
usually enough in practice. See scripts/capture_fixtures.py for how to
capture and inspect real portal HTML if you want to chase this further (a
browser HAR trace of clicking the forward-week arrow is what's needed).
Cancelled/substituted lessons are also unverified: no real capture has had
one yet, so Lesson.is_changed/is_cancelled are always False for now.
Install
pip install pyedookit
Usage
import asyncio
from pyedookit import login, EdookitClient
async def main():
session = await login("zs-example", "parent@example.com", "hunter2")
client = EdookitClient(session)
for lesson in await client.get_timetable(week_offset=0):
print(lesson.start, lesson.subject, lesson.room)
asyncio.run(main())
client.get_events() returns upcoming school events (SchoolEvent, all-day
events have date start/end with an inclusive end), and client.get_payments()
returns the family's payment totals and requests (Payments, amounts as
Decimal). Only paid requests have been seen on a real portal so far; a request
without the "accepted" marker is reported as unpaid.
client.fetch_page(name) returns the raw HTML of a page that has no parser yet
(CAPTURE_PAGES: assignments, exams, inbox, consents), and
content_fingerprint(html) tells you when such a page's content changed.
Persist session.to_json() / Session.from_json() between runs instead of
storing the password; use pyedookit.refresh(session) to renew the
short-lived edookit session from the long-lived Plus4U cookie, and fall back
to login() only when refresh() raises AuthError.
Lesson times are timezone-aware (pyedookit.PORTAL_TZ, Europe/Prague).
Errors all derive from EdookitError:
| Exception | Meaning | What to do |
|---|---|---|
SessionExpired |
short-lived edookit session aged out | refresh() and retry |
AuthError |
bad credentials, or the Plus4U cookie expired | full login() |
EdookitConnectionError |
network error or 30 s timeout | retry later |
ParseError |
portal markup changed | parser needs updating |
login(), refresh() and EdookitClient all accept an optional
http: aiohttp.ClientSession to reuse. Cookies are handled by hand, so
create that session with cookie_jar=aiohttp.DummyCookieJar(); a session
with a real cookie jar would also store and resend the portal's cookies.
Development
uv sync --group dev
uv run pytest
uv run ruff check .
uv run mypy src
Releasing
Bump version in pyproject.toml, then push a vX.Y.Z tag. The
Publish to PyPI workflow tests, builds and uploads using PyPI trusted
publishing, which has to be configured once on pypi.org for this repository
and the pypi environment.
Metadata
Release files for pyedookit 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pyedookit-0.3.1.tar.gz | 111.7 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyedookit-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 131.4 kB
Release files / pyedookit-0.3.1.tar.gz
| Download URL | pyedookit-0.3.1.tar.gz |
|---|---|
| Size | 111.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f77d11241aa3ae49344e9445a22595237abc218da638ccd35e683ec0a33b6969
|
|
BLAKE2b-256 checksum How to use checksums |
462395c79a662b38bc110fa7158154a8ff5800f9a229f2895f3cfefe21d39d04
|
| 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 Oct 10, 2026.
Transparency logRelease files / pyedookit-0.3.1-py3-none-any.whl
| Download URL | pyedookit-0.3.1-py3-none-any.whl |
|---|---|
| Size | 19.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b07f83c3e0b5a1f69513a3fdbbd6b5899a051b8ea1ffc5b936fb449cde89a552
|
|
BLAKE2b-256 checksum How to use checksums |
7778de7c20c3f20e06c7ef302f5145ab9a9b912a6d0dd2b8ae8afdeee5e1eba3
|
| 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 Oct 10, 2026.
Transparency logSecurity for pyedookit 0.3.1
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for pyedookit-0.3.1.tar.gz
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 Oct 10, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.