Skip to content Meet Mira, the AI assistant built into your student information system
Integrations & API

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.

Updated 3 min read

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).

How to connect: your API address and the calls to make.
How to connect: your API address and the calls to make.
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

EndpointReturnsNeeds
GET /meThe school and the service account the token acts astenant.read
GET /students, /students/{id}Studentsstudents.read
GET /classes, /subjects, /school-years, /termsSchool structureclasses.read
GET /guardiansParents and guardians with their childrenguardians.read
GET /attendanceAttendance marksattendance.read
GET /gradesAssessment resultsgrades.read
GET /employeesStaffstaff.read
GET /events, /announcementsSchool events and announcementscalendar.read
GET /paygira/bills, /paygira/balances, /paygira/paymentsBillingpaygira.read
GET /transportation/routes, /stops, /buses, /assignmentsTransportationtransport.read
GET /deleted?updated_since=Records deleted since a timeAny 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

  1. The first time, read each list in full and keep the next_updated_since value from the answer.

  2. After that (once a day is plenty; hourly at most), add ?updated_since= with that value to /students, /guardians, /employees, /attendance and the PayGira lists. You get only what is new or changed. Keep the new next_updated_since each time.

  3. 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

StatusMeaningWhat to do
400 invalid_requestA parameter is wrong, for example a malformed updated_sinceFix the request; times look like 2026-11-01T08:00:00Z
401The access token is missing, expired or revokedGet a new access token
403The token doesn't have that areaAdd the scope to the token, if its service account allows it
429 rate_limited / daily_limit_reachedToo 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?