API explorer API explorer Every public endpoint of the /api/v1 API, with parameters, an example request and an example response. Read-only, and no login required.
All endpoints require an API key sent as a Bearer token. See Authentication for how to create one. The examples below use esk_... as a placeholder for your key.
Identity GET /me The authenticated principal and its organisation Request
curl -X GET https://edushell.app/api/v1/me \
-H "Authorization: Bearer esk_..."
Response 200
{
"user" : {
"id" : "7c6b5a49-2f10-4e8b-b1a2-6d5c4b3a2f10" ,
"email" : "trainer@acme.example" ,
"name" : "Alex Trainer"
} ,
"org" : {
"id" : "3d2c1b0a-9f8e-7d6c-5b4a-3c2d1e0f9a8b" ,
"name" : "Acme Academy" ,
"slug" : "acme"
} ,
"role" : "trainer"
}
Organisation GET /orgs/{orgId}/members List the organisation's members Parameters
Name Type In orgId · required uuid path
Request
curl -X GET https://edushell.app/api/v1/orgs/{orgId}/members \
-H "Authorization: Bearer esk_..."
Response 200
[
{
"user_id" : "7c6b5a49-2f10-4e8b-b1a2-6d5c4b3a2f10" ,
"email" : "alex@acme.example" ,
"name" : "Alex Trainer" ,
"role" : "trainer"
} ,
{
"user_id" : "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d" ,
"email" : "sam@acme.example" ,
"name" : "Sam Admin" ,
"role" : "admin"
}
]
PATCH /orgs/{orgId}/members/{userId} Change a member's role Parameters
Name Type In orgId · required uuid path userId · required uuid path role · required string (admin | trainer) body
Request
curl -X PATCH https://edushell.app/api/v1/orgs/{orgId}/members/{userId} \
-H "Authorization: Bearer esk_..." \
-H "Content-Type: application/json" \
-d '{"role":"admin"}'
Response 200
{
"user_id" : "7c6b5a49-2f10-4e8b-b1a2-6d5c4b3a2f10" ,
"role" : "admin"
}
DELETE /orgs/{orgId}/members/{userId} Remove a member Parameters
Name Type In orgId · required uuid path userId · required uuid path
Request
curl -X DELETE https://edushell.app/api/v1/orgs/{orgId}/members/{userId} \
-H "Authorization: Bearer esk_..."
Response 204
GET /orgs/{orgId}/events Read the activity log Parameters
Name Type In orgId · required uuid path limit integer query
Request
curl -X GET https://edushell.app/api/v1/orgs/{orgId}/events \
-H "Authorization: Bearer esk_..."
Response 200
[
{
"id" : "a3f1c9e2-7b40-4c1a-9e6d-2b8f0a1c4d5e" ,
"type" : "member.role_changed" ,
"actor" : "sam@acme.example" ,
"occurred_at" : "2026-07-29T14:12:05Z" ,
"data" : {
"user_id" : "7c6b5a49-2f10-4e8b-b1a2-6d5c4b3a2f10" ,
"from" : "trainer" ,
"to" : "admin"
}
}
]
Sessions GET /sessions List sessions Request
curl -X GET https://edushell.app/api/v1/sessions \
-H "Authorization: Bearer esk_..."
Response 200
[
{
"id" : "9b1f0e2d-3c4b-5a69-8778-6d5c4b3a2f10" ,
"title" : "Kubernetes 101, cohort A" ,
"state" : "scheduled" ,
"capacity" : 12 ,
"starts_at" : "2026-08-03T09:00:00Z"
}
]
POST /sessions Create a session Parameters
Name Type In title · required string body lab_version_id · required uuid body capacity · required integer body starts_at timestamp (ISO 8601) body
Request
curl -X POST https://edushell.app/api/v1/sessions \
-H "Authorization: Bearer esk_..." \
-H "Content-Type: application/json" \
-d '{"title":"Kubernetes 101, cohort A","lab_version_id":"5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b","capacity":12,"starts_at":"2026-08-03T09:00:00Z"}'
Response 201
{
"id" : "9b1f0e2d-3c4b-5a69-8778-6d5c4b3a2f10" ,
"title" : "Kubernetes 101, cohort A" ,
"state" : "scheduled" ,
"capacity" : 12 ,
"starts_at" : "2026-08-03T09:00:00Z"
}
GET /sessions/{sessionId} Get a session Parameters
Name Type In sessionId · required uuid path
Request
curl -X GET https://edushell.app/api/v1/sessions/{sessionId} \
-H "Authorization: Bearer esk_..."
Response 200
{
"id" : "9b1f0e2d-3c4b-5a69-8778-6d5c4b3a2f10" ,
"title" : "Kubernetes 101, cohort A" ,
"state" : "running" ,
"capacity" : 12 ,
"participants" : 9
}
DELETE /sessions/{sessionId} Delete a session Parameters
Name Type In sessionId · required uuid path
Request
curl -X DELETE https://edushell.app/api/v1/sessions/{sessionId} \
-H "Authorization: Bearer esk_..."
Response 204
POST /sessions/{sessionId}/join-code Rotate the join code Parameters
Name Type In sessionId · required uuid path
Request
curl -X POST https://edushell.app/api/v1/sessions/{sessionId}/join-code \
-H "Authorization: Bearer esk_..."
Response 200
{
"join_code" : "TIGER-42"
}
Labs GET /labs List labs Request
curl -X GET https://edushell.app/api/v1/labs \
-H "Authorization: Bearer esk_..."
Response 200
[
{
"id" : "2f3a4b5c-6d7e-8f90-a1b2-c3d4e5f6a7b8" ,
"name" : "Kubernetes 101" ,
"tier" : "cluster"
}
]
GET /labs/{labId}/versions List a lab's versions Parameters
Name Type In labId · required uuid path
Request
curl -X GET https://edushell.app/api/v1/labs/{labId}/versions \
-H "Authorization: Bearer esk_..."
Response 200
[
{
"id" : "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b" ,
"version" : 3 ,
"status" : "published" ,
"published_at" : "2026-07-20T10:00:00Z"
} ,
{
"id" : "6f7a8b9c-0d1e-2f3a-4b5c-6d7e8f9a0b1c" ,
"version" : 4 ,
"status" : "draft"
}
]
Developers GET /orgs/{orgId}/api-keys List API keys Parameters
Name Type In orgId · required uuid path
Request
curl -X GET https://edushell.app/api/v1/orgs/{orgId}/api-keys \
-H "Authorization: Bearer esk_..."
Response 200
[
{
"id" : "b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e" ,
"prefix" : "esk_9f2a1c" ,
"role" : "trainer" ,
"created_at" : "2026-07-10T08:30:00Z" ,
"revoked_at" : null
}
]
POST /orgs/{orgId}/api-keys Create an API key Parameters
Name Type In orgId · required uuid path name · required string body role · required string (admin | trainer) body
Request
curl -X POST https://edushell.app/api/v1/orgs/{orgId}/api-keys \
-H "Authorization: Bearer esk_..." \
-H "Content-Type: application/json" \
-d '{"name":"CI pipeline","role":"trainer"}'
Response 201
{
"id" : "b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e" ,
"key" : "esk_9f2a1c7d4b8e6a3f2c1d0e9b8a7c6d5e" ,
"prefix" : "esk_9f2a1c" ,
"role" : "trainer"
}
GET /orgs/{orgId}/webhooks List webhook endpoints Parameters
Name Type In orgId · required uuid path
Request
curl -X GET https://edushell.app/api/v1/orgs/{orgId}/webhooks \
-H "Authorization: Bearer esk_..."
Response 200
[
{
"id" : "c3d4e5f6-a7b8-9c0d-1e2f-3a4b5c6d7e8f" ,
"url" : "https://example.com/webhooks/edushell" ,
"event_types" : [
"member.removed" ,
"org.closed"
]
}
]
POST /orgs/{orgId}/webhooks Create a webhook endpoint Parameters
Name Type In orgId · required uuid path url · required string (https) body event_types · required string[] body description string body
Request
curl -X POST https://edushell.app/api/v1/orgs/{orgId}/webhooks \
-H "Authorization: Bearer esk_..." \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/webhooks/edushell","event_types":["member.removed","org.closed"],"description":"Prod listener"}'
Response 201
{
"id" : "c3d4e5f6-a7b8-9c0d-1e2f-3a4b5c6d7e8f" ,
"url" : "https://example.com/webhooks/edushell" ,
"event_types" : [
"member.removed" ,
"org.closed"
] ,
"secret" : "whsec_4b8e6a3f2c1d0e9b8a7c6d5e4f3a2b1c"
}