People & Access
Licenses & Devices
Read expiry, extend or revoke licenses, and manage device seats per app.
Each institution user holds one license (student, faculty or institution for lab machines). A license has an expiry, a maximum number of activations and a status: active, expired, suspended or revoked.
Read#
curl "$API/licenses?status=active&expires_before=2026-12-31T00:00:00Z" -H "Authorization: Bearer $KEY"
curl $API/licenses/summary -H "Authorization: Bearer $KEY" # counts by type/status + expiring in 30 days
curl $API/licenses/lic_… -H "Authorization: Bearer $KEY"Extend#
curl -X POST $API/licenses/lic_…/extend -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{ "days": 180 }'
curl -X POST $API/licenses/lic_…/extend -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{ "expires_at": "2027-06-30T00:00:00Z" }'Extending an expired license reactivates it.
Revoke#
curl -X POST $API/licenses/lic_…/revoke -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{ "reason": "left institution" }'The app signs out on its next heartbeat (≤ 5 minutes).
Devices#
Each app (groutapp, groutcode, groutfilm) allows 2 active device seats per user. The oldest seat is signed out when a third device logs in.
curl $API/licenses/lic_…/devices -H "Authorization: Bearer $KEY"
curl -X POST $API/licenses/lic_…/devices/<seat_id>/revoke -H "Authorization: Bearer $KEY"The response lists seats (per app, with device name, platform, app version, last seen) and legacy activations.
Expiry automation#
license.expiredfires when a license passes its expiry (daily sweep, or lazily when the app checks in).- Subscribe to it and call
POST /licenses/{id}/extendfrom your billing system, or let it lapse. GET /licenses/summaryexposesexpiring_within_30_daysfor dashboards.
Events#
license.generated, license.expired, license.device_registered.