Skip to main content

pyedstem

Typed Python client for the Ed Stem API.

Documentation: alexdrbanana.github.io/pyedstem

pyedstem provides a small, sync-first interface for common Ed Stem tasks such as listing active courses, retrieving discussion threads, reading lessons, and posting answers back to Ed using the XML document format the API expects.

Installation

Install with pip

pip install pyedstem

Add to a uv project

uv add pyedstem

Configuration

You can create a client directly with an API token:

from pyedstem import EdStemClient

client = EdStemClient(api_token="your-edstem-token")

Or load configuration from environment variables:

  • EDSTEM_API_TOKEN — required
  • EDSTEM_BASE_URL — optional, defaults to https://edstem.org/api
  • EDSTEM_TIMEOUT_SECONDS — optional, defaults to 30.0
from pyedstem import EdStemClient

with EdStemClient.from_env() as client:
    current_user = client.user.get_current_user()

Quick start

List active courses

from pyedstem import EdStemClient

with EdStemClient.from_env() as client:
    active_courses = client.courses.list_active()

for course in active_courses:
    print(course.id, course.code, course.name)

Fetch recent discussion threads

from pyedstem import EdStemClient

course_id = 12345

with EdStemClient.from_env() as client:
    threads = client.threads.list(course_id, limit=20, sort="date")

for thread in threads:
    print(f"#{thread.number}: {thread.title}")

Post an answer

from pyedstem import EdStemClient

with EdStemClient.from_env() as client:
    client.threads.post_answer(
        thread_id=67890,
        markdown="Hi there,\n\nThanks for the question...",
    )

Features

  • typed models for common Ed Stem responses
  • sync-first client API with resource groups
  • markdown-to-Ed document conversion for answer posting
  • opt-in live contract tests for undocumented API drift detection

Development

Clone the repository, then install development dependencies with uv:

uv sync --group dev

Run the test suite:

uv run pytest tests

Live contract tests

The repository includes an opt-in live suite under tests/live/ that probes documented Ed endpoints so API changes can be detected early.

Safe read-only live tests:

EDSTEM_RUN_LIVE_TESTS=1 uv run pytest tests/live/test_endpoint_contracts.py tests/live/test_restricted_endpoint_contracts.py

Opt-in write test for posting answers:

EDSTEM_RUN_WRITE_TESTS=1 \
EDSTEM_WRITE_TEST_THREAD_ID=12345 \
uv run pytest tests/live/test_write_endpoint_contracts.py

Only enable the write suite when it is safe to mutate real Ed data.

Documentation

Full documentation is available at:

alexdrbanana.github.io/pyedstem

If you're contributing to the project and want to preview the docs locally:

uv sync --group dev --group docs
uv run mkdocs serve

Then open the local URL shown by MkDocs.

Metadata

Release files for pyedstem 0.3.0

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

Source distribution (sdist)

Source distribution for pyedstem 0.3.0
File Size Uploaded Provenance Actions
pyedstem-0.3.0.tar.gz 43.4 kB With provenance Details for pyedstem-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pyedstem 0.3.0
File Interpreter ABI Platform Actions
pyedstem-0.3.0-py3-none-any.whl Python 3 none any Details for pyedstem-0.3.0-py3-none-any.whl

Total release size: 56.9 kB

Release files / pyedstem-0.3.0.tar.gz

Download URL pyedstem-0.3.0.tar.gz
Size 43.4 kB
Tags Source
SHA-256 checksum
How to use checksums
4b24af56b2aefe82a361fe639f33b566c33184b997b680e67a1f51a7cf75d1d9
BLAKE2b-256 checksum
How to use checksums
148e46141ccbe29df6b32dd41b65b346ac86f52366c868c6a97dab9685f424df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Mar 14, 2026.

Transparency log

Release files / pyedstem-0.3.0-py3-none-any.whl

Download URL pyedstem-0.3.0-py3-none-any.whl
Size 13.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
99f4e7a0f8ade9598a90708fc8b9d74ab7f18f9ae7b0f01c931ef95305b6d3c3
BLAKE2b-256 checksum
How to use checksums
f9ae956ee4ca583ef206823c9f05dca4448662c712814375f17b9180924e2f3d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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 Mar 14, 2026.

Transparency log

Security for pyedstem 0.3.0

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 pyedstem-0.3.0.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 Mar 14, 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