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 —
ClientandAsyncClientshare 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,
cursus, 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.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 | |
|---|---|---|---|
| 42api-0.1.1.tar.gz | 79.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 42api-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 109.1 kB
Release files / 42api-0.1.1.tar.gz
| Download URL | 42api-0.1.1.tar.gz |
|---|---|
| Size | 79.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7ac722e1404ccfeefa8b1a5b914e8af31002ec9e698eb8711d789e219f6a2d74
|
|
BLAKE2b-256 checksum How to use checksums |
3d07778e429d4b15020a8b1f1258ce84ef2ed52de22aaaee7f1242bf6f3968a2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / 42api-0.1.1-py3-none-any.whl
| Download URL | 42api-0.1.1-py3-none-any.whl |
|---|---|
| Size | 29.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
27e935a343676f40459f6b14b639325b6e8648b73575effe79b11dfae44e6e2e
|
|
BLAKE2b-256 checksum How to use checksums |
ebdc30f8e0d97fbcecc3f8a9c984df4c5139cbf606a6193ad8ab065f85260a61
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|