Skip to content

API endpoints

A curated reference of the controller’s /api/v1 surface, grouped by family. For the authentication model, the RBAC + audit pattern, and error shapes, see Controller API.

Conventions:

  • All application routes are under /api/v1; GET /metrics and GET /healthz are at the root.
  • Successful responses are { "data": ... }; some writes return 201/202; deletes and logout return 204.
  • Perm is the exact RBAC permission checked. Agent rows are authenticated by a node credential, not a user permission (the listed label is the audit permission).

Auth & session — /api/v1/auth

Method & pathPermPurpose
POST /auth/loginIssue a session token.
POST /auth/logoutRevoke the current session.
GET /auth/meCurrent user + resolved permissions.

OIDC — /api/v1/auth/oidc

Method & pathPermPurpose
GET /auth/oidc/configPublic OIDC config.
GET /auth/oidc/loginStart the login redirect.
GET /auth/oidc/callbackComplete login (redirect with token).
GET /auth/oidc/discoveryauth:manageFetch IdP discovery doc.

Access / RBAC — /api/v1/auth/*

Method & pathPermPurpose
GET /auth/users · POST /auth/usersauth:manageList / create users.
GET /auth/users/:idauth:manageUser detail + action states.
PATCH /auth/users/:id/accessauth:manageUpdate roles/grants/groups.
PATCH /auth/users/:id/password · /status · DELETE /auth/users/:idauth:manageLifecycle (reset/enable-disable/delete).
GET /auth/groups · POST /auth/groupsauth:manageList / create groups.
GET /auth/groups/:idauth:manageGroup detail + members.
PATCH /auth/groups/:id · DELETE /auth/groups/:idauth:manageUpdate name/description / delete (cascade).
PUT /auth/groups/:id/membersauth:manageReplace membership by member ids.
GET /auth/access-policies · PATCH /auth/access-policiesauth:manageRead / replace access policies.

Audit — /api/v1/audit-events

Method & pathPermPurpose
GET /audit-eventsaudit:readList/filter events.
GET|POST /audit-events/exportaudit:readExport (filtered / selected).
GET /audit-events/facetsaudit:readFilter facets.
GET /audit-events/:idaudit:readDetail + before/after.

Nodes — /api/v1/nodes

Method & pathPermPurpose
GET /nodes · GET|POST /nodes/exportnode:readList / export inventory (scoped).
GET /nodes/:id · /:id/actionsnode:readDetail / action summaries.
GET /nodes/:id/meters · GET /meter-eventsnode:readMeter snapshot / SSE stream.
GET /nodes/agent-releasenode:readLatest agent release (update check).
POST /nodes/enrollnode:manageEnroll node (returns credential).
PATCH /nodes/:id · /:id/interfaces/:iidnode:manageUpdate node / interface.
PUT /nodes/:id/channel-roomsnode:manageAssign node channels to rooms.
POST /nodes/:id/credentials/rotatenode:manageRotate node controller token.
GET /nodes/:id/ssh-credential · POST /:id/ssh-credential/rotatenode:manageRead public SSH key / rotate keypair (private key never returned).
POST /nodes/:id/bootstrap-tokennode:manageMint a single-use, short-TTL day-0 bootstrap token.
GET /nodes/:id/lifecycle-jobsnode:readList lifecycle runs.
POST /nodes/:id/lifecycle/:actionnode:manageRun an allowlisted lifecycle action.
POST /nodes/:id/listen · GET /:id/listen/stream · DELETE /:id/listen/:sidlisten:monitorStart ({enhance}) / stream / stop live listen.

Agent service routes (node-credential)

Method & pathAudit permPurpose
GET /nodes/:id/confignode:controlNode config + cache policies + capacity.
GET /nodes/:id/channel-map-assignmentsnode:controlAssigned channel maps.
POST /nodes/:id/heartbeatnode:controlNode heartbeat.
POST /nodes/:id/inventorynode:controlReconcile interfaces from discovered inventory (startup).
POST /nodes/:id/meter-framenode:controlPush a meter frame.
POST /nodes/:id/listen/chunknode:controlIngest live-listen audio (?rendition).
POST /nodes/:id/health-eventshealth:acknowledgeSync a health event.
GET /nodes/:id/recording-jobs/nextrecording:controlPoll the next queued job (peek, no lease).
POST /nodes/:id/recording-jobs/claim-nextrecording:controlAtomically claim the next queued job.
POST /nodes/:id/recording-jobs/claim-next-grouprecording:controlClaim the next queued job + its capture-group siblings (one shared capture).
POST /recording-jobs/:jid/claimrecording:controlClaim a specific queued job by id.
POST /recording-jobs/:jid/heartbeatrecording:controlJob heartbeat.
GET /recording-jobs/:jidrecording:control/recording:readRead job (dual-mode auth).
POST /recording-jobs/:jid/cancelled · /failedrecording:controlTerminal job state.
PUT /recordings/:rid/cache-filerecording:controlUpload a captured/rendered file (?rendition=raw|enhanced); the primary completes the job, raw is supplementary.

Onboarding & runner routes (special auth)

These two routes are not authenticated by a node credential or a user session — see Node onboarding.

Method & pathAuthPurpose
POST /nodes/:id/bootstrapsingle-use bootstrap tokenDay-0: accept node-generated SSH key + inventory, mint controller token.
GET /nodes/:id/ssh-credential/materialrunner token (RAKKR_RUNNER_TOKEN)Runner fetch of the decrypted SSH key (+ ?mintToken=1 for a fresh token).

Recordings — /api/v1/recordings

Method & pathPermPurpose
GET /recordings · /facets · /:id · /:id/context · /:id/actionsrecording:readLibrary reads (scoped).
GET|POST /recordings/exportrecording:readExport manifest (filtered / selected).
POST /recordingsrecording:createStart an ad-hoc recording.
POST /recordings/:id/stoprecording:controlStop a recording.
POST /recordings/:id/playback · GET /:id/streamrecording:playbackStart / stream playback.
POST /recordings/:id/download · GET /:id/filerecording:downloadPrepare / download file.
PATCH /recordings/:id/metadata · /bulk-metadatarecording:editEdit / bulk-organize.
DELETE /recordings/:id · POST /recordings/bulk-deleterecording:deleteDelete terminal recordings.

Recording jobs & uploads

Method & pathPermPurpose
GET /recording-jobs · /:id · /:id/actions · GET|POST /exportrecording:readJob reads / export.
POST /recording-jobs/:id/retry · /bulk-retry · /bulk-stoprecording:controlRetry / stop jobs.
GET /upload-queue · /:id · /:id/actionsrecording:readQueue reads.
POST /recordings/:id/upload-queue · /bulk-upload-queue · POST /upload-queue/:id/retryrecording:controlEnqueue / retry uploads.
GET /upload-runner · /actionsrecording:readRunner status.
POST /upload-runner/runrecording:controlTrigger a runner pass.

Schedules — /api/v1/schedules

Method & pathPermPurpose
GET /schedules · /:id · /:id/occurrences · /:id/actions · GET|POST /exportschedule:readReads / occurrences / export.
GET /schedules/calendarschedule:readWindowed occurrences across all schedules.
POST /schedules · PATCH /:id · DELETE /:idschedule:manageCreate / update / delete.
POST /schedules/:id/run-now · /skip-nextschedule:manageForce / skip the next occurrence.
POST /schedules/:scheduleId/move-occurrenceschedule:manageDrag-to-reschedule a single occurrence.

Rooms — /api/v1/rooms

Room identity CRUD is inventory-adjacent (node:read / node:manage); the roster (access control) is auth:manage.

Method & pathPermPurpose
GET /roomsnode:readList rooms.
POST /roomsnode:manageCreate a room.
GET /rooms/:roomIdnode:readRoom detail.
PATCH /rooms/:roomIdnode:manageUpdate a room.
DELETE /rooms/:roomIdnode:manageDelete a room.
GET /rooms/:roomId/overviewnode:readAggregated room page payload.
GET /rooms/:roomId/rosterauth:manageRead the room roster.
PUT /rooms/:roomId/rosterauth:manageReplace the manual room roster.

Settings & retention — /api/v1/settings/*

Each settings family supports GET list, GET /:id, and GET /:id/actions reads under settings:read. Mutations require settings:manage.

FamilyReadManage
Recording profilessettings:readPOST / PATCH /settings/recording-profiles/:id
Watchdog policiessettings:readPOST / PATCH /settings/watchdog-policies/:id (+ calibrate)
Upload destinations / policiessettings:readPATCH/POST destinations & policies
Channel-map templates / assignments / planssettings:readcreate/update templates; PUT assignments (+ bulk, rollback); stage/apply plans
Retention policiessettings:readPOST / PATCH /settings/retention-policies/:id
Controllersettings:readPATCH /settings/controller (weekStartsOn + scheduling defaults)

Switchers — /api/v1/settings/switchers

Method & pathPermPurpose
GET /settings/switchers · /:idswitcher:readList / read switcher config.
GET /settings/switcher-mapping-optionsswitcher:readRooms/users for the map editor.
GET /settings/switchers/:id/mappingsswitcher:readRead input→room / output→user maps.
POST /settings/switchersswitcher:manageCreate a switcher.
PATCH /settings/switchers/:idswitcher:manageUpdate a switcher.
DELETE /settings/switchers/:idswitcher:manageDelete a switcher.
POST /settings/switchers/:id/testswitcher:manageConnection test.
GET /settings/switchers/:id/config-snapshotswitcher:manageRead a device config snapshot.
POST /settings/switchers/:id/restoreswitcher:manageRestore a snapshot to the device.
PUT /settings/switchers/:id/mappingsswitcher:mapReplace-all input/output mappings.

Health — /api/v1/health-events

Method & pathPermPurpose
GET /health-events · /:id · /:id/actions · GET|POST /exporthealth:readReads / export.
POST /health-events · /bulk-lifecyclehealth:acknowledgeCreate / bulk lifecycle.
POST /health-events/:id/acknowledge · /suppress · /resolve · /reopenhealth:acknowledgeSingle-event lifecycle.

Status & metrics

Method & pathPermPurpose
GET /api/v1/statusnode:readAggregated scoped status (nodes, recordings, health, uptime).
GET /metricsmetrics:readPrometheus exposition (root path).
GET /healthzLiveness.
GET /readyzReadiness (503 while the database is unreachable).