REST endpoints for modules, sandbox sessions, submissions, and admin operations. All requests use JSON. Authenticate with a session token.
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_…"/v1/auth/sessionCreate a session for a role
{ "role": "user" | "admin" }{ "token": "sess_…", "user": { "id": "u1", "role": "user" } }/v1/meGet current session
{ "id": "u1", "name": "Alex Carter", "role": "user" }/v1/modulesList published training modules
[ { "id": "m1", "title": "AI Security Awareness", "difficulty": "Beginner" } ]/v1/modules/:idGet a module by id
{ "id": "m1", "objectives": [...], "labPrompt": "..." }/v1/modulesCreate a module
{ "title": "...", "difficulty": "Beginner", "category": "..." }{ "id": "m_new", "status": "draft" }/v1/modules/:idUpdate a module
{ "status": "published" }{ "id": "m1", "status": "published" }/v1/modules/:idDelete a module
204 No Content
/v1/sandbox/runSpin up a sandbox container
{ "moduleId": "m2" }{ "sessionId": "sb_…", "endpoint": "wss://…", "ttl": 1800 }/v1/sandbox/:id/stopStop a running sandbox
{ "stopped": true }/v1/submissionsSubmit lab findings
{ "moduleId": "m2", "content": "payload + writeup" }{ "id": "s_…", "status": "pending" }/v1/submissionsList submissions (own or all for admin)
[ { "id": "s1", "score": 92, "status": "passed" } ]/v1/submissions/:idGrade a submission
{ "status": "passed", "score": 88 }{ "id": "s1", "status": "passed" }/v1/admin/usersList all users
[ { "id": "u1", "role": "user" } ]/v1/admin/progressAggregate progress report
{ "completionRate": 0.42 }