Skip to content

API Reference

This document lists all HTTP API endpoints for the Admin service.

  • Base URL: http://localhost:28081/api
  • Authentication: Bearer Token (JWT)
  • Content-Type: application/json
{
"success": true,
"data": { ... }
}
{
"success": false,
"error": "error_code",
"message": "Human-readable error message"
}
{
"success": true,
"data": {
"list": [ ... ],
"total": 100,
"page": 1,
"page_size": 20
}
}
POST /api/auth/otp/send
Content-Type: application/json
{
"email": "admin@example.com"
}

Response:

{
"success": true,
"message": "Verification code sent"
}

Errors:

Error CodeDescription
invalid_emailInvalid email format
email_not_registeredEmail not registered
rate_limitedToo many requests
cooldown_not_elapsedSend cooldown not elapsed
POST /api/auth/otp/verify
Content-Type: application/json
{
"email": "admin@example.com",
"code": "123456"
}

Response:

{
"success": true,
"data": {
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"refresh_token": "eyJhbGciOiJSUzI1NiIs...",
"expires_in": 3600
}
}

Errors:

Error CodeDescription
invalid_codeInvalid verification code
code_expiredCode expired
account_lockedAccount locked
max_attempts_exceededMax verification attempts exceeded
POST /api/auth/refresh
Content-Type: application/json
{
"refresh_token": "eyJhbGciOiJSUzI1NiIs..."
}

Response:

{
"success": true,
"data": {
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"expires_in": 3600
}
}
POST /api/auth/logout
Authorization: Bearer <access_token>

Response:

{
"success": true
}
GET /api/auth/me
Authorization: Bearer <access_token>

Response:

{
"success": true,
"data": {
"id": "user-uuid",
"email": "admin@example.com",
"name": "Admin",
"roles": [
{ "id": "role-uuid", "name": "admin", "code": "admin" }
]
}
}
POST /api/admin/users
Authorization: Bearer <access_token>
Content-Type: application/json
{
"email": "newadmin@example.com",
"name": "New Admin",
"role_ids": ["role-uuid"]
}

Permission: admin:write

GET /api/admin/users?page=1&page_size=20
Authorization: Bearer <access_token>

Permission: admin:read

GET /api/admin/users/:id
Authorization: Bearer <access_token>

Permission: admin:read

PUT /api/admin/users/:id
Authorization: Bearer <access_token>
Content-Type: application/json
{
"name": "New Name",
"role_ids": ["role-uuid"]
}

Permission: admin:write

DELETE /api/admin/users/:id
Authorization: Bearer <access_token>

Permission: admin:delete

POST /api/admin/roles
Authorization: Bearer <access_token>
Content-Type: application/json
{
"name": "Custom Role",
"code": "custom_role",
"description": "Role description"
}

Permission: role:write

GET /api/admin/roles
Authorization: Bearer <access_token>

Permission: role:read

GET /api/admin/roles/:id
Authorization: Bearer <access_token>

Permission: role:read

PUT /api/admin/roles/:id
Authorization: Bearer <access_token>
Content-Type: application/json
{
"name": "New Role Name",
"description": "New description"
}

Permission: role:write

DELETE /api/admin/roles/:id
Authorization: Bearer <access_token>

Permission: role:delete

GET /api/admin/roles/:id/permissions
Authorization: Bearer <access_token>

Permission: role:read

PUT /api/admin/roles/:id/permissions
Authorization: Bearer <access_token>
Content-Type: application/json
{
"permissions": [
{ "object": "users", "action": "read" },
{ "object": "users", "action": "write" }
]
}

Permission: role:write

POST /api/admin/users/:id/roles
Authorization: Bearer <access_token>
Content-Type: application/json
{
"role_ids": ["role-uuid-1", "role-uuid-2"]
}

Permission: admin:write

GET /api/admin/users/:id/roles
Authorization: Bearer <access_token>

Permission: admin:read

GET /api/rtc-users?page=1&page_size=20
Authorization: Bearer <access_token>

Permission: user:read

GET /api/rtc-users/:id
Authorization: Bearer <access_token>

Permission: user:read

POST /api/rtc-users/:id/ban
Authorization: Bearer <access_token>
Content-Type: application/json
{
"reason": "Terms of Service violation",
"duration": 86400
}

Permission: user:write

Parameters:

  • reason: Ban reason
  • duration: Ban duration in seconds (omit for permanent ban)
POST /api/rtc-users/:id/unban
Authorization: Bearer <access_token>

Permission: user:write

GET /api/rtc-users/:id/devices
Authorization: Bearer <access_token>

Permission: user:read

DELETE /api/rtc-users/:user_id/devices/:device_id
Authorization: Bearer <access_token>

Permission: user:write

GET /api/rtc-sessions?user_id=:user_id&page=1&page_size=20
Authorization: Bearer <access_token>

Permission: session:read

GET /api/rtc-sessions/:id
Authorization: Bearer <access_token>

Permission: session:read

DELETE /api/rtc-sessions/:id
Authorization: Bearer <access_token>

Permission: session:delete

GET /api/rtc-messages?session_id=:session_id&page=1&page_size=50
Authorization: Bearer <access_token>

Permission: message:read

GET /api/server-configs
Authorization: Bearer <access_token>

Permission: config:read

GET /api/server-configs/:key
Authorization: Bearer <access_token>

Permission: config:read

PUT /api/server-configs/:key
Authorization: Bearer <access_token>
Content-Type: application/json
If-Match: "2024-01-01T00:00:00Z"
{
"value": "new-value"
}

Permission: config:write

Optimistic Lock: Use If-Match header with updated_at value to prevent concurrent conflicts

DELETE /api/server-configs/:key
Authorization: Bearer <access_token>

Permission: config:write

GET /api/user-configs?user_id=:user_id
Authorization: Bearer <access_token>

Permission: config:read

PUT /api/user-configs/:key
Authorization: Bearer <access_token>
Content-Type: application/json
{
"user_id": "user-uuid",
"value": "custom-value"
}

Permission: config:write

DELETE /api/user-configs/:key?user_id=:user_id
Authorization: Bearer <access_token>

Permission: config:write

GET /api/audit-logs?page=1&page_size=20&resource=config
Authorization: Bearer <access_token>

Permission: audit:read

Query Parameters:

  • resource: Resource type (optional)
  • resource_id: Resource ID (optional)
  • user_id: Operator user ID (optional)
  • action: Action type (optional)
GET /api/metrics/query?query=up
Authorization: Bearer <access_token>

Permission: metrics:read

GET /api/grafana/d/rtc-agent/rtc-agent
Authorization: Bearer <access_token>

Permission: metrics:read

GET /api/jaeger/search?service=rtc-agent
Authorization: Bearer <access_token>

Permission: tracing:read

GET /api/pyroscope/
Authorization: Bearer <access_token>

Permission: profiling:read

GET /ready

No authentication required

Normal Response:

{ "status": "ready" }

Degraded Response:

{
"status": "degraded",
"error": "bootstrap failed — default roles may be missing"
}
ResourceActionPermission Code
Adminreadadmin:read
Adminwriteadmin:write
Admindeleteadmin:delete
Rolereadrole:read
Rolewriterole:write
Roledeleterole:delete
RTC Userreaduser:read
RTC Userwriteuser:write
Sessionreadsession:read
Sessiondeletesession:delete
Messagereadmessage:read
Configreadconfig:read
Configwriteconfig:write
Auditreadaudit:read
Metricsreadmetrics:read
Tracingreadtracing:read
Profilingreadprofiling:read
Error CodeHTTP StatusDescription
unauthorized401Not authenticated or invalid token
forbidden403No permission to access
not_found404Resource not found
conflict409Resource conflict (e.g., optimistic lock conflict)
validation_error422Request parameter validation failed
rate_limited429Too many requests
internal_error500Internal server error