Skip to main content

42api

An object-oriented Python client for the 42 School API (api.intra.42.fr) that handles OAuth2 authentication, request pacing, and pagination for you, so you can work with typed resources instead of raw JSON and HTTP plumbing.

  • Sync and async — Client and AsyncClient share one codebase and the same interface.
  • Typed models — resources are Pydantic v2 models with IDE-friendly autocomplete.
  • Automatic rate limiting — requests are paced to stay under 42's limits; 429s are retried with backoff automatically.
  • Lazy pagination — iterate a query and it walks every page for you.

Install

uv add 42api
# or: pip install 42api

Usage

from intra42 import Client

with Client(client_id="...", client_secret="...") as client:
    user = client.users.get("jdoe")
    print(user.login, user.email)

    for user in client.users.filter(campus_id=1).sort("-level"):
        print(user.login)

Async is the same shape:

import asyncio
from intra42 import AsyncClient


async def main() -> None:
    async with AsyncClient(client_id="...", client_secret="...") as client:
        user = await client.users.get("jdoe")
        async for user in client.users.filter(campus_id=1).sort("-level"):
            print(user.login)


asyncio.run(main())

Fetched instances expose their nested resources directly — no need to build the scoped path yourself:

campus = client.campuses.get(1)
for event in campus.events:  # GET /campus/1/events
    print(event.name)

user = client.users.get("jdoe")
for cu in user.campus_users:  # GET /users/jdoe/campus_users
    print(cu.campus_id, cu.is_primary)

These (campus.events, campus.users, user.events, user.campus_users) are only available on instances fetched via a client — a manually constructed model raises a clear RuntimeError if accessed.

Get your client_id/client_secret by registering an app at https://profile.intra.42.fr/oauth/applications. This library uses the client credentials flow, so it accesses the API as your app rather than as a specific logged-in user.

Errors

All errors subclass intra42.FortyTwoAPIError, with subclasses for common HTTP statuses: AuthenticationError (401), PermissionDeniedError (403), NotFoundError (404), ValidationError (422), RateLimitError (429, only raised once the built-in retry budget is exhausted), ServerError (5xx), and NetworkError (connection/timeout failures).

Status

Early-stage: currently covers users, campuses, campus_users, events, and locations (including its graph analytics endpoint). More resources are added incrementally on top of the same client/model/ query-builder pattern.

Development

Uses uv for dependency management.

uv sync                                               # install dependencies
uv run pytest                                         # run tests
uv run ruff check . && uv run ruff format --check .   # lint
uv run mypy                                           # type check

The sync client (intra42._sync) is generated from the async client (intra42._async) via unasync — edit the async source and regenerate:

uv run python scripts/unasync_generate.py            # regenerate
uv run python scripts/unasync_generate.py --check    # verify no drift (CI)

License

MIT

Release files for 42api 0.1.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 42api 0.1.0
File Size Uploaded
42api-0.1.0.tar.gz 78.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for 42api 0.1.0
File Interpreter ABI Platform
42api-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 106.6 kB

Release files / 42api-0.1.0.tar.gz

Download URL 42api-0.1.0.tar.gz
Size 78.7 kB
Tags Source
SHA-256 checksum
How to use checksums
ebef698a2141d07b35b7958476b42caba4f4f8bdc633d696e38907506e08ee6b
BLAKE2b-256 checksum
How to use checksums
9849f3361f3408e4c643ad65db3992cc3332c7eff0d0d37fa6413a4176626129
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / 42api-0.1.0-py3-none-any.whl

Download URL 42api-0.1.0-py3-none-any.whl
Size 27.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bfb4da8b7847f805c74577f3435dab695b075850ee0f82ee0559a5ea07644891
BLAKE2b-256 checksum
How to use checksums
7c5a2655ca29dabc0c63de9b0fec3e33fe493736c6c594b7c4d55352e11b9f09
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

This release

0.1.0 This release

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