Neptun API & App

Reverse Engineering · API

My university has no public API — so I built one, then put a phone app on top of it.

neptun illustration

Neptun is the system every Hungarian university runs on — grades, schedule, tuition, messages — and it's notoriously clunky, with no API for students. So I reverse-engineered one out of its mobile endpoints and built the client I actually wanted.

4data domains covered
RESTFastAPI + Swagger
FlutterAndroid client
RIPold endpoints retired

The idea

I wanted my own data — schedule, grades, payments, messages — in a form I could actually build on, instead of fighting the official web UI. There was no public API, so the only way through was to figure out how the official mobile app talks to the server and speak the same language.

Reverse-engineering

The Neptun mobile app talks to a set of MobileCloudService endpoints. I traced those calls, worked out the session-based authentication, and reimplemented the whole conversation — login, then typed requests for each kind of data — as clean async Python.

API + app

NeptunMobileCloudService
REST wrapperFastAPI + Swagger
Flutter appAndroid client

The result is two pieces: a FastAPI REST wrapper — fully documented with Swagger/ReDoc, type-safe Pydantic models, async throughout — covering schedule/calendar, academic info (terms, grades), finances (payments, tuition) and messages; and a Flutter Android app on top of it. (The API was ported from an earlier Dart implementation that grew out of the app itself.)

Status

Sunset, honestly. It worked great while it lasted — but the university moved off the old Neptun endpoints, so the reverse-engineered API no longer has a server to talk to. It stays here as a clean example of the work: trace a private protocol, model it, and rebuild it as something usable.

Built with

Python, FastAPI + uvicorn, Pydantic models, async httpx against the reverse-engineered MobileCloudService endpoints, with Swagger/ReDoc docs — plus a Flutter / Dart Android client on top.