Reference
Mobile endpoints
Generated from the OpenAPI document. Read the device API guide first for the
activation flow and the request-signing algorithm; this page is the field-level detail.
Preview See availability: device activation is not yet possible in production.
Device endpoints (17)#
Unauthenticated liveness endpoint. Reports the API version and Play Integrity mode.
Responses
POST /api/v1/mobile/activation/start #
Redeem a pairing code and register a device key
Pairing code + device challenge — no token yet operationId startMobileActivation
Consumes a single-use 8-character Crockford pairing code, validates the Ed25519 public key and Play Integrity verdict, creates a PENDING device and returns a 5-minute signature challenge. Rate limited to 10 requests per minute per IP. In live Play Integrity mode the token must be issued within the last 10 minutes and must carry requestHash set to the lowercase hex SHA-256 of the exact publicKeyPem string sent in this request; otherwise activation is refused.
Request body · ActivationStartRequest (application/json)
Responses
POST /api/v1/mobile/activation/complete #
Prove key possession and receive device tokens
Pairing code + device challenge — no token yet operationId completeMobileActivation
Verifies the Ed25519 signature over deviceId.challenge.tenantId.userId and issues an opaque access token, refresh token and 14-day lease.
Request body · ActivationCompleteRequest (application/json)
Responses
Signature-only authentication. The previous refresh token is invalidated and the device lease is renewed. Allowed after the access token and lease have expired.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Request body (application/json)
Responses
Marks the device REVOKED and invalidates all access tokens.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Responses
Tenant thresholds, scanner allowlist, offline policy and retention settings.
Requires the five X-RR-* signing headers — how to sign a request.
Responses
Returns only learners in the cohorts assigned to the device. The response carries an ETag for conditional requests.
Requires the five X-RR-* signing headers — how to sign a request.
Responses
GET /api/v1/mobile/sessions #
Scheduled sessions and venues
Device bearer token + signed request Signed request headers operationId getMobileSessions
Sessions for the next 14 days derived from assigned cohort schedules and venues.
Requires the five X-RR-* signing headers — how to sign a request.
Responses
POST /api/v1/mobile/enrolments #
Enrol ISO/IEC 19794-2 fingerprint templates
Device bearer token + signed request Signed request headers operationId enrolMobileBiometrics
Accepts 1–4 minutiae templates. The server validates format, size, NFIQ2 and minutiae count, rejects duplicate templates enrolled to another learner, and stores only a SHA-256 template hash. No image or raw template is retained. Requires recorded POPIA consent and the learner M1 biometric preference.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Request body · EnrolmentRequest (application/json)
Responses
POST /api/v1/mobile/match #
Bounded 1:1 or scoped 1:N fingerprint match
Device bearer token + signed request Signed request headers operationId matchMobileBiometrics
ONE_TO_MANY searches only the device’s assigned cohorts and venues. A no-match response contains no candidate list. Probe templates are never stored.
Requires the five X-RR-* signing headers — how to sign a request.
Request body · MatchRequest (application/json)
Responses
POST /api/v1/mobile/attendance/events #
Submit one online attendance event
Device bearer token + signed request Signed request headers operationId submitMobileAttendanceEvent
Validates the geofence, applies the existing attendance ledger rules and records the event. Retries with the same clientRequestId return the original result with idempotentReplay = true.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Request body · AttendanceEventRequest (application/json)
Responses
POST /api/v1/mobile/sync/batches #
Upload an offline attendance batch
Device bearer token + signed request Signed request headers operationId syncOfflineBatch
Verifies the device hash chain and Ed25519 batch signature, enforces a strict deviceSeq, and accepts or rejects each event independently. Gaps and chain mismatches fail the batch.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Request body · SyncBatchRequest (application/json)
Responses
Returns the last accepted device sequence, batch hash and lease state.
Requires the five X-RR-* signing headers — how to sign a request.
Responses
Battery, storage, scanner and app version. Allowed while a wipe is pending so the device can acknowledge it.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Request body · HeartbeatRequest (application/json)
Responses
POST /api/v1/mobile/telemetry #
Submit non-PII diagnostics
Device bearer token + signed request Signed request headers operationId submitMobileTelemetry
Operational diagnostics with no learner identifiers or biometric data.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Responses
POST /api/v1/mobile/evidence/upload-url #
Create a signed evidence upload URL
Device bearer token + signed request Signed request headers operationId createEvidenceUploadUrl
Returns an HMAC-signed, short-lived upload URL for non-biometric evidence. Returns 501 when no evidence store is configured.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Request body (application/json)
Responses
POST /api/v1/mobile/wipe/ack #
Acknowledge a remote wipe
Device bearer token + signed request Signed request headers operationId acknowledgeMobileWipe
Confirms that local roster, templates and cached evidence have been removed.
Idempotent: send a stable clientRequestId. A replay returns HTTP 200 with data.idempotentReplay = true.
Requires the five X-RR-* signing headers — how to sign a request.
Responses
Administration endpoints (6)#
Used by tenant administrators (in the console) to issue pairing codes and to revoke or wipe devices.
They require an administrator session and a tenant-administrator role, not device credentials.
Tenant-scoped pairing codes. Only the HMAC hash is stored; the plaintext code is shown once at creation.
Responses
Creates a single-use 15-minute pairing code bound to a tenant and optionally to cohorts and venues. Roles: R1, R2, R3, R6.
Request body (application/json)
Responses
Revokes an unused pairing code. Roles: R1, R2, R3, R6.
Parameters
Responses
Tenant-scoped device inventory with status, lease and last-seen metadata. Roles: R1, R2, R3, R6.
Responses
Immediately invalidates tokens and blocks all device calls. Roles: R1, R2.
Parameters
Responses
Sets a wipe instruction; the device confirms through /mobile/wipe/ack. Roles: R1, R2.
Parameters
Responses