Skip to main content

aula_connect

A Python client for Aula, the Danish school and institution platform. It logs in through MitID - with the MitID app's QR code or code - and reads the children's profiles, daily overviews (presence), calendars, birthdays, messages, notifications, weekly plans (Meebook, EasyIQ, MinUddannelse) and newsletters into typed models.

It is the library the Home Assistant integration ha_aula_connect is built on.

It is asynchronous, and runs on the aiohttp session the caller gives it. A login's cookies are its own, so each login and each client has a session of its own, not one shared with other services:

import aiohttp
from aula_connect import AulaClient, AulaLoginClient

async with aiohttp.ClientSession() as session:
    login = AulaLoginClient(session, mitid_username="...")  # approve in the MitID app
    tokens = (await login.authenticate())["tokens"]
    client = AulaClient(
        session,
        access_token=tokens["access_token"],
        refresh_token=tokens["refresh_token"],
        expires_at=tokens["expires_at"],
        mitid_username="...",
        login_client=login,
    )
    data = await client.login()

While the login runs, login.get_qr_codes_svg() gives the two QR codes to show in turn for the MitID app to scan.

What Aula sends

A client keeps the newest answer to each request it sends Aula and its widgets, with its headers and when it came, and the newest failure of each request that failed - an error's status, or an error in place of an answer, such as a timeout - even where a later answer succeeded. It keeps them in memory only, 200 answers and 50 failures at most, and never a request's headers. To see what Aula sends, read everything once and take the answers with who someone is replaced:

failed = await client.read_everything(start, end)  # what could not be read, and why
answers = client.responses(key)  # key: bytes kept secret, the same each time

answers holds Aula's API version, each request with its answer, and the type at each place of each kind of answer, to see where Aula has changed. Every value that tells who someone is gets another of the same length and kinds of characters, the same one wherever it is and for as long as the key is the same, so that what belongs together still does:

  • ids, under their keys and inside texts and links, and numbers that are known ids;
  • names, word by word, under their keys and, written with a capital, inside every text;
  • e-mail addresses, phone numbers and CPR numbers anywhere, and addresses under their keys;
  • the query of every link, as it can sign it.

The MitID username and every token the client holds are hidden wherever they stand, as is what a request for a token answers, and any value under a key of a secret, a cookie among them, or that looks like a token: a text becomes as many "x", a number as many 9s.

Dates, times, other numbers and the rest of each text are kept. A name Aula gives under no key of a name, such as another child's in a message, is kept with them, so the answers are still personal data: share them only with who needs them. The messages of every thread on the newest page are read, but not those of a thread Aula marks sensitive, which the client never reads.

aula_connect.testing has a simulated Aula for tests, on local test servers: SimulatedAulaLogin answers the whole login chain - Aula's OAuth, UniLogin, NemLog-in and a simulated MitID - and SimulatedAulaApi Aula's API and its widgets, with the data a test gives it. Each checks the cookies, tokens and proofs the real one checks, and takes a mitid_connect.testing.Network that gives each answer a latency and fails a share of them, for stress tests.

Origin and licence

The login and API client come from the Home Assistant integration HairingX/aula, a fork of scaarup/aula, and are licensed as it is: GNU GPL v3.0 or later (LICENSE). The MitID login started as the Aula login client by mchrdk. MitID itself is reached through mitid_connect.

Metadata

Release files for aula-connect 0.1.1

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

Source distribution (sdist)

Source distribution for aula-connect 0.1.1
File Size Uploaded Provenance Actions
aula_connect-0.1.1.tar.gz 124.0 kB With provenance Details for aula_connect-0.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for aula-connect 0.1.1
File Interpreter ABI Platform Actions
aula_connect-0.1.1-py3-none-any.whl Python 3 none any Details for aula_connect-0.1.1-py3-none-any.whl

Total release size: 215.8 kB

Release files / aula_connect-0.1.1.tar.gz

Download URL aula_connect-0.1.1.tar.gz
Size 124.0 kB
Tags Source
SHA-256 checksum
How to use checksums
39be174de56b3741ba29c50d00ed1679a089e9b0090563e8d834024d3789d6ec
BLAKE2b-256 checksum
How to use checksums
81bf81b88134ec422b14b2bbffb42a3571867dbb1dff476e1562e4a507778e2b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Release files / aula_connect-0.1.1-py3-none-any.whl

Download URL aula_connect-0.1.1-py3-none-any.whl
Size 91.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4b728db105948861d51f7c314182258bb34ec69c700ccfba937467d71936f923
BLAKE2b-256 checksum
How to use checksums
576ce90a495e784b9fb9263bd81adad352de0e11e85b374a5ff7813757c12808
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Nov 4, 2026.

Transparency log

Security for aula-connect 0.1.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.

Select from 2 files

Attestation for aula_connect-0.1.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 Nov 4, 2026.

Transparency log

A 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.

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