Use the Managira API
Exchange your credentials for an access token, read students, classes, attendance, grades and more, page through lists and keep in sync with updated_since.
The Managira API is a read-only REST API that returns JSON. An integration exchanges its credentials for a one-hour access token, then reads the areas its service account allows. Every call stays inside one school.
Who can do this: Developers connecting another system, using credentials from Service accounts and access tokens.
1. Get an access token
Send your client ID, client secret and personal access token to /auth/token on your school's API address (shown under How to connect on the Access Tokens page, ending in /api/v1).

POST /api/v1/auth/token
Content-Type: application/json
{
"client_id": "YOUR_CLIENT_ID",
"client_secret": "mgr_cs_...",
"personal_access_token": "mgr_pat_..."
}
200 OK
{
"access_token": "...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "managira.api.access tenant.read students.read"
}
Tip: Keep the access token until it expires (one hour) and reuse it for every call, then ask for a new one. Asking for a token before every call is slower and counts against the token limit (20 requests a minute from one address).
2. Read data
Send the access token in the Authorization header.
GET /api/v1/students?limit=100&offset=0
Authorization: Bearer YOUR_ACCESS_TOKEN
200 OK
{
"data": [ { "id": 1042, "first_name": "Emma", "last_name": "Johnson", "status": "active", ... } ],
"limit": 100,
"offset": 0,
"has_more": true,
"next_updated_since": "2026-11-09T07:55:00.000Z"
}
Endpoints
| Endpoint | Returns | Needs |
|---|---|---|
GET /me | The school and the service account the token acts as | tenant.read |
GET /students, /students/{id} | Students | students.read |
GET /classes, /subjects, /school-years, /terms | School structure | classes.read |
GET /guardians | Parents and guardians with their children | guardians.read |
GET /attendance | Attendance marks | attendance.read |
GET /grades | Assessment results | grades.read |
GET /employees | Staff | staff.read |
GET /events, /announcements | School events and announcements | calendar.read |
GET /paygira/bills, /paygira/balances, /paygira/payments | Billing | paygira.read |
GET /transportation/routes, /stops, /buses, /assignments | Transportation | transport.read |
GET /deleted?updated_since= | Records deleted since a time | Any area |
Page through lists
Lists return up to 50 rows. Add limit (up to 200) and offset to page. Keep reading while has_more is true.
Keep in sync without downloading everything
The first time, read each list in full and keep the
next_updated_sincevalue from the answer.After that (once a day is plenty; hourly at most), add
?updated_since=with that value to/students,/guardians,/employees,/attendanceand the PayGira lists. You get only what is new or changed. Keep the newnext_updated_sinceeach time.People who leave come back with a status (students: graduated or left; staff: on_hold or removed). Read
/deleted?updated_since=for records that were deleted.
GET /api/v1/students?updated_since=2026-11-01T08:00:00Z
Authorization: Bearer YOUR_ACCESS_TOKEN
Errors and limits
| Status | Meaning | What to do |
|---|---|---|
400 invalid_request | A parameter is wrong, for example a malformed updated_since | Fix the request; times look like 2026-11-01T08:00:00Z |
| 401 | The access token is missing, expired or revoked | Get a new access token |
| 403 | The token doesn't have that area | Add the scope to the token, if its service account allows it |
429 rate_limited / daily_limit_reached | Too many calls (120 a minute, 10,000 a day per school by default) | Wait for the Retry-After seconds; request a bigger allowance if needed |
Good to know: Errors come back as { "error": "...", "message": "..." } with a sentence you can show in logs.
Frequently asked questions
Is there a sandbox?
Use a service account that can read only what you are testing, on your own school. The API never changes data, so reading is always safe.
Which time zone are dates in?
Times are in UTC (ending in Z). Dates without a time, such as attendance days, are the school's calendar dates.
Can I get webhooks?
Not yet. Use updated_since to pick up changes; once a day suits most integrations.
Was this guide helpful?