External API
The Team Training API gives an organization direct, read-only access to its Rogue Arena training records. Use it to feed an LMS, data warehouse, compliance dashboard, or your own reporting workflow without recreating the Team Hub UI.
The API returns data, not rendered reports. Your integration decides how often to call it, which users or event types to request, and how to present or retain the results.
Create a key
Section titled “Create a key”- Sign in to Rogue Arena and open Team Hub.
- Select External API in the left sidebar.
- Give the key a name that identifies the integration, such as
Learning data warehouse. - Select only the permissions that integration needs.
- Choose an expiration date, no more than 365 days away, and select Create API key.
- Copy the complete key immediately. Rogue Arena stores a one-way hash and cannot show the secret again.
An organization can have up to five active keys. Keys remain owned by the organization if their creator leaves, but every key stops authenticating as soon as its organization is disabled or deleted. If a creator’s or revoker’s account is permanently deleted, that personal attribution is shown as null; the organization-owned key and its other audit history remain. For rotation, create a replacement, update the integration, verify it, and then revoke the old key.
Organization and learner scope
Section titled “Organization and learner scope”Every request is authorized against the organization’s current Team Hub roster. A user-specific route accepts a userId only while that account is a current member of the key’s organization. Removing a learner immediately removes that learner from the former organization’s API scope.
Under the current Team Hub data model, training history belongs to the learner account rather than to a frozen organization record. That history follows the account: if the learner later joins another organization, their retained history can be included in that new organization’s authorized results. Export any records you must retain before removing a learner, and apply your own retention policy to exported data.
Authenticate
Section titled “Authenticate”Send the key as an HTTP bearer token. The production base URL is https://arena.roguelabs.io.
curl --fail-with-body \ --header "Authorization: Bearer $ROGUE_ARENA_TEAM_API_KEY" \ "https://arena.roguelabs.io/api/v1/team/users?limit=100"Keys begin with ra_training_live_. Never place a key in source control, browser code, a shared document, or a deployed lab VM. Store it in your platform’s secret manager.
Permissions
Section titled “Permissions”| Permission | Grants access to |
|---|---|
team:members:read | Member names, usernames, email addresses, account status, and stable user IDs |
team:progress:read | Courses, scenarios, curricula, chapter unlocks, question completion, and progress summaries |
team:answers:read | Learner-submitted answers, correctness, score, and submission context |
team:events:read | Training, certification, deployment, chapter, and answer events |
team:activity:read | Sharing, file, snapshot, warp, and daily VM, VPN, keystroke, and video activity |
team:activity:read is separate because this activity is more sensitive. Each event type requires its corresponding permission; a key with both permissions can read the whole unified stream.
Endpoints
Section titled “Endpoints”| Endpoint | Purpose | Required permission |
|---|---|---|
GET /api/v1/team/users | Find active or disabled members and obtain stable user IDs | team:members:read |
GET /api/v1/team/training-progress | Fetch compact progress rows across the team | team:progress:read |
GET /api/v1/team/users/{userId}/training-progress | Fetch a member’s detailed course, scenario, curriculum, chapter, and question progress | team:progress:read |
GET /api/v1/team/users/{userId}/answer-attempts | Fetch a member’s answer-attempt history | team:answers:read |
GET /api/v1/team/users/{userId}/deployments | Fetch lifecycle history for deployments launched by that member | team:progress:read |
GET /api/v1/team/events | Fetch the unified, sanitized event stream | team:events:read and/or team:activity:read, according to the requested types |
The canonical, downloadable OpenAPI 3.1 document contains the parameter and response schemas.
Start with a user
Section titled “Start with a user”List users first and retain each member’s id. It is the stable userId accepted by the other endpoints.
curl --get --fail-with-body \ --header "Authorization: Bearer $ROGUE_ARENA_TEAM_API_KEY" \ --data-urlencode "status=all" \ "https://arena.roguelabs.io/api/v1/team/users"Then request that user’s detailed training state:
curl --fail-with-body \ --header "Authorization: Bearer $ROGUE_ARENA_TEAM_API_KEY" \ "https://arena.roguelabs.io/api/v1/team/users/USER_ID/training-progress"For high-volume syncs, use the compact team endpoint and follow nextCursor. The detailed endpoint is best for a user drill-down.
Interpret historical context
Section titled “Interpret historical context”Answer attempts preserve the submission-time curriculum, scenario, target, and question context when that snapshot exists. By contrast, courseId and courseName are nullable, current inferences. They can be unavailable or ambiguous after course relationships change and must not be treated as a submission-time course snapshot.
Answer history includes attempts from earlier progress cycles. A non-null archivedAt means the attempt was archived by a learner-progress reset; current progress totals count only active attempts. Keep these records when an audit needs the complete history, or filter them out when reconciling the history to current attemptCount and questionsAnswered values.
For new direct submissions, response snapshots include the learner-facing text selected for multiple-choice answers and safe submitted labels for matching, ordering, and diagram answers. The corresponding IDs remain present. Older snapshots can have empty or null label values, and malformed response snapshots are returned as unavailable. These fields capture only the learner’s submitted response; they never include unselected choices, authored correctness flags, or answer-key configuration.
When team collaboration credits an answer to another learner, that recipient’s row has origin: "collaborative". The attempt, correctness, score, and curriculum context remain available, but response is { "kind": "unavailable" }. This prevents one learner’s submitted content from crossing organization boundaries through a collaborator’s history.
Use context.targetType to distinguish chapter from ctf_node. Chapter attempts populate chapterId and chapterName; CTF attempts populate ctfNodeId and ctfNodeName. The fields for the other target type are null.
The deployments endpoint reports deployments owned and launched by the selected member. It does not add deployments that the member only accessed as a shared guest. Use sharing and activity events when you need to analyze guest participation. startedAt is the first time the owner or an authorized participant opened the owned deployment.
What is deliberately excluded
Section titled “What is deliberately excluded”The API is organization-scoped to accounts on the current roster and returns reviewed reporting fields rather than internal service records. It never returns correct-answer keys, uploaded file contents, raw logger JSON, private file paths, window titles, VM identifiers, or voucher identifiers. The learner-owned history behavior described above still applies when an account changes organizations.
Some older answer attempts cannot be linked exactly to the deployment or content version that existed when the learner answered. Those records use explicit legacy_unavailable markers; Rogue Arena does not guess. Deployment history similarly identifies legacy gaps with historyCoverage: "legacy_partial".
Next: Pagination, rate limits, and errors or the event catalog.