Base URL
https://api.fineeduc.comThe same API our own dashboard runs on. Nothing separate, nothing held back: what the app can do, you can do.
https://api.fineeduc.comEvery call carries a JWT in the Authorization header. You get one by signing in with your school account; it is scoped to that school and reaches nothing else.
Authorization: Bearer <access_token>These calls go to the production API, straight from your browser. Nothing passes through our web servers.
Held in memory only, never stored. Close the tab and it is gone.
Get a token
Replace :id and other parameters with real values.
Response
No request sent yet.
/auth/login-schoolSigns in to a school and returns the tokens./auth/refreshExchanges a refresh token for a new access token./auth/meThe current user and their role./auth/logoutRevokes the session./studentsPaginated, filterable list./students/:idOne student’s full record./students/:id/enrollEnrols the student and generates their instalments./students/:id/guardiansThe paying guardians attached to them./fee-schedulesFee schedules./fee-schedules/:id/publishPublishes a version — it becomes immutable./invoices/:idOne invoice and its instalments./invoices/:studentId/statementA student’s statement: owed, paid, outstanding./cash-sessionsOpens a session with a starting float./cash-sessions/paymentsRecords a cash payment./cash-sessions/:id/expectedWhat the drawer should hold right now./cash-sessions/:id/closeCloses with a count; any variance needs a reason./pay/:tokenThe public parent page — no session needed./pay/:token/initiateStarts a mobile money or card payment./moratoire/:tokenThe parent-facing delay request./moratoriums/:id/approveGrants the delay and reschedules the instalments./moratoriums/:id/refuseRefuses the request, with a reason./tenant/subscriptionThe plan, the deadline and the time remaining./tenant/subscription/checkoutOpens a renewal payment./healthLiveness probe./health/readyDatabase and Redis reachable.Every error follows RFC 9457 (application/problem+json). The code field is stable and meant for your code; detail is written for a human and may be reworded.
{
"type": ".../errors/HTTP_402",
"title": "PaymentRequired",
"status": 402,
"code": "SUBSCRIPTION_LAPSED",
"detail": "…",
"traceId": "…"
}Per minute, per IP: 10 on auth routes, 30 on the public payment pages, 120 on webhooks. Exceeding one returns 429 with the standard RateLimit headers.
There is no API key today that lets a third-party service call Fineduc without a session. Authentication is by user token only. We would rather say so than document something you could not actually use.
Send your request in 2 minutes. Our team reviews it within 24 hours and sends you your access details — then 7 days free.