Introduction
Xporter exposes a compliant IMS Global OneRoster v1.1 API that allows third-party systems to retrieve rostering data (organisations, users, classes, enrolments, and academic sessions) from schools connected to the platform.
The Xporter web layer proxies requests to an internal Azure Functions back-end. Each function authenticates the caller by decrypting the Xporter bearer token and then executes a parameterised stored procedure against the identity database.
Base URL
https://xporter.groupcall.com/api/ims/oneroster/v1p1
Architecture overview
Integrator
│
│ POST /token (Basic auth: client_id:client_secret)
▼
Xporter Web (OneRosterController)
│ forwards Xporter Bearer token + query string
▼
Identity API (Azure Functions — OneRoster.cs)
│ validates token via IdaasAuthorization.DecriptXodToken
│ executes stored procedure via EntityFrameworkContext
▼
Identity SQL Database (gcidm schema)
Authentication
This API uses OAuth 2.0 client credentials flow. Obtain a token first and include it in all subsequent requests.
Step 1 — Obtain a bearer token
Send a POST request to the /token endpoint with your client_id and client_secret in a
Basic Authorization header:
Authorization: Basic <base64(client_id:client_secret)>
Example request
POST /api/ims/oneroster/v1p1/token HTTP/1.1
Host: xporter.groupcall.com
Authorization: Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=
Successful response (200 OK)
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}
Error response (401 Unauthorized)
{
"error": "invalid_client",
"error_description": "Request contains an invalid client ID or secret"
}
Step 2 — Call protected endpoints
Include the token in the Authorization header of every subsequent request:
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Query parameter support
All collection endpoints support the following query parameters. sort, orderBy, and fields are
accepted but are not forwarded to the back-end and have no effect.
| Parameter | Implemented | Description |
|---|---|---|
limit | ✅ | Maximum number of records to return. Omitting it returns all matching records. |
offset | ✅ | Zero-based index of the first record to return. Use with limit for pagination. |
filter | ✅ Partial | Single key='value' expression. Only status is supported. The enrollments endpoint ignores this filter. |
sort | ❌ | Accepted but ignored. |
orderBy | ❌ | Accepted but ignored. |
fields | ❌ | Accepted but ignored. |
Filter syntax
filter=status='active'
filter=status='tobedeleted'
Only a single key='value' expression is supported. Complex AND/OR expressions are not parsed.
Error responses
Failed data requests return 400 Bad Request with a plain-text body (the raw exception message),
not JSON. Handle 400 responses accordingly.
| Code | Scenario |
|---|---|
200 OK | Request succeeded. |
400 Bad Request | Token invalid/missing or server-side error. Body is plain text, not JSON. |
401 Unauthorized | Returned only by POST /token when client credentials are invalid. |
403 Forbidden | Bearer token absent on a collection endpoint. |
Integration checklist
- Obtain your
client_idandclient_secretfrom the Xporter platform. - Call
POST /tokenand cache theaccess_token— reuse it untilexpires_inseconds have elapsed. - When
400or403is received on a data endpoint, re-authenticate and retry once. - Use
limit+offsetto page through large result sets. Omittinglimitreturns all records. - Use
filter=status='active'to exclude soft-deleted records where required. - Do not use
sort,orderBy, orfields— these are silently ignored. - Expect
/coursesto always return{ "courses": [] }(Microsoft SDS stub only). - Link users to classes: join
users→enrollments→classesviasourcedId. - Parent↔child relationships are carried in
User.agents, not in a separate endpoint.
Authentication
- HTTP: Bearer Auth
Bearer token obtained from POST /token.
Security Scheme Type: | http |
|---|---|
HTTP Authorization Scheme: | bearer |
Bearer format: | JWT |
📄️ Introduction
Xporter exposes a compliant [IMS Global OneRoster v1.1](https://www.imsglobal.org/activity/oneroster) API
📄️ Obtain a bearer token
Authenticate using client credentials (OAuth 2.0 `client_credentials` grant).
📄️ Get all organisations
Returns all organisations (schools) the authenticated relying party has access to.
📄️ Get all users
Returns all users (staff and students) for the authenticated relying party.
📄️ Get all classes
Returns all classes for the authenticated relying party.
📄️ Get all enrolments
Returns all enrolments (user–class associations) for the authenticated relying party.
📄️ Get all academic sessions
Returns all academic sessions (school years / terms) for the authenticated relying party.
📄️ Get all courses (stub)
**Stub endpoint — always returns an empty array.**
📄️ Get API version
Returns the OneRoster specification version string. Does not require authentication.