Observed since 20 Oct, 15:40 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Object-oriented Python client for the 42 School API (api.intra.42.fr)
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.
Client and AsyncClient share one codebase and the
same interface.429s are retried with backoff automatically.uv add 42api
# or: pip install 42api
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(primary_campus_id=1).sort("-pool_year"):
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(primary_campus_id=1).sort("-pool_year"):
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.
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).
Early-stage: currently covers users, accreditations, campuses,
campus_users, cursus, events, exams, locations, projects, and
projects_users (exams, locations, and projects_users each include
their graph analytics endpoint). More resources are added incrementally
on top of the same client/model/query-builder pattern.
The api with restricted access are not implemented currently.
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)
MIT
pypistats · 42 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-20 – 2026-10-20 | 15 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-19 – 2026-10-19 | 9 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-18 – 2026-10-18 | 11 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-17 – 2026-10-17 | 23 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-16 – 2026-10-16 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-15 – 2026-10-15 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-14 – 2026-10-14 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-13 – 2026-10-13 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-12 – 2026-10-12 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-11 – 2026-10-11 | 13 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-10 – 2026-10-10 | 9 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-09 – 2026-10-09 | 10 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-08 – 2026-10-08 | 21 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-07 – 2026-10-07 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-06 – 2026-10-06 | 10 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-05 – 2026-10-05 | 14 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-04 – 2026-10-04 | 12 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-03 – 2026-10-03 | 9 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-02 – 2026-10-02 | 7 | 2026-10-21T10:18:53.7310721Z |
| 2026-10-01 – 2026-10-01 | 10 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-30 – 2026-09-30 | 15 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-29 – 2026-09-29 | 17 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-28 – 2026-09-28 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-27 – 2026-09-27 | 18 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-26 – 2026-09-26 | 7 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-25 – 2026-09-25 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-24 – 2026-09-24 | 177 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-23 – 2026-09-23 | 4 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-21 – 2026-09-21 | 5 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-20 – 2026-09-20 | 2 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-18 – 2026-09-18 | 11 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-17 – 2026-09-17 | 6 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-16 – 2026-09-16 | 8 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-15 – 2026-09-15 | 2 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-14 – 2026-09-14 | 2 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-13 – 2026-09-13 | 2 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-12 – 2026-09-12 | 6 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-11 – 2026-09-11 | 2 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-10 – 2026-09-10 | 83 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-09 – 2026-09-09 | 5 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-08 – 2026-09-08 | 6 | 2026-10-21T10:18:53.7310721Z |
| 2026-09-07 – 2026-09-07 | 124 | 2026-10-21T10:18:53.7310721Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.3 | 24 Sept 2026 | 2 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 15:40 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:281277bac8f444ccd107c113c8fdb9f4247532add05d1124bcbd85b3fb22a2f9