v1.0 · Stable

API Reference

REST endpoints for modules, sandbox sessions, submissions, and admin operations. All requests use JSON. Authenticate with a session token.

Latency
p95 · 84ms
Auth
Bearer token
Format
JSON · UTF-8
# Quickstart
curl -X POST https://api.art-hub.io/v1/auth/session \
  -H "Content-Type: application/json" \
  -d '{ "role": "user" }'

# → use the returned token
curl https://api.art-hub.io/v1/modules \
  -H "Authorization: Bearer sess_…"

Auth

POST/v1/auth/session
public

Create a session for a role

Request
{ "role": "user" | "admin" }
Response
{ "token": "sess_…", "user": { "id": "u1", "role": "user" } }
GET/v1/me
user

Get current session

Response
{ "id": "u1", "name": "Alex Carter", "role": "user" }

Modules

GET/v1/modules
user

List published training modules

Response
[ { "id": "m1", "title": "AI Security Awareness", "difficulty": "Beginner" } ]
GET/v1/modules/:id
user

Get a module by id

Response
{ "id": "m1", "objectives": [...], "labPrompt": "..." }
POST/v1/modules
admin

Create a module

Request
{ "title": "...", "difficulty": "Beginner", "category": "..." }
Response
{ "id": "m_new", "status": "draft" }
PATCH/v1/modules/:id
admin

Update a module

Request
{ "status": "published" }
Response
{ "id": "m1", "status": "published" }
DELETE/v1/modules/:id
admin

Delete a module

Response
204 No Content

Sandbox

POST/v1/sandbox/run
user

Spin up a sandbox container

Request
{ "moduleId": "m2" }
Response
{ "sessionId": "sb_…", "endpoint": "wss://…", "ttl": 1800 }
POST/v1/sandbox/:id/stop
user

Stop a running sandbox

Response
{ "stopped": true }

Submissions

POST/v1/submissions
user

Submit lab findings

Request
{ "moduleId": "m2", "content": "payload + writeup" }
Response
{ "id": "s_…", "status": "pending" }
GET/v1/submissions
user

List submissions (own or all for admin)

Response
[ { "id": "s1", "score": 92, "status": "passed" } ]
PATCH/v1/submissions/:id
admin

Grade a submission

Request
{ "status": "passed", "score": 88 }
Response
{ "id": "s1", "status": "passed" }

Admin

GET/v1/admin/users
admin

List all users

Response
[ { "id": "u1", "role": "user" } ]
GET/v1/admin/progress
admin

Aggregate progress report

Response
{ "completionRate": 0.42 }