EduShell
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 as a placeholder for your key.

Identity

GET/meThe authenticated principal and its organisation
Request
bash
curl -X GET https://edushell.app/api/v1/me \
  -H "Authorization: Bearer esk_..."
Response 200
json
{
  "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}/membersList the organisation's members
Parameters
NameTypeIn
orgId · requireduuidpath
Request
bash
curl -X GET https://edushell.app/api/v1/orgs/{orgId}/members \
  -H "Authorization: Bearer esk_..."
Response 200
json
[
  {
    "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
NameTypeIn
orgId · requireduuidpath
userId · requireduuidpath
role · requiredstring (admin | trainer)body
Request
bash
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
json
{
  "user_id": "7c6b5a49-2f10-4e8b-b1a2-6d5c4b3a2f10",
  "role": "admin"
}
DELETE/orgs/{orgId}/members/{userId}Remove a member
Parameters
NameTypeIn
orgId · requireduuidpath
userId · requireduuidpath
Request
bash
curl -X DELETE https://edushell.app/api/v1/orgs/{orgId}/members/{userId} \
  -H "Authorization: Bearer esk_..."
Response 204
GET/orgs/{orgId}/eventsRead the activity log
Parameters
NameTypeIn
orgId · requireduuidpath
limitintegerquery
Request
bash
curl -X GET https://edushell.app/api/v1/orgs/{orgId}/events \
  -H "Authorization: Bearer esk_..."
Response 200
json
[
  {
    "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/sessionsList sessions
Request
bash
curl -X GET https://edushell.app/api/v1/sessions \
  -H "Authorization: Bearer esk_..."
Response 200
json
[
  {
    "id": "9b1f0e2d-3c4b-5a69-8778-6d5c4b3a2f10",
    "title": "Kubernetes 101, cohort A",
    "state": "scheduled",
    "capacity": 12,
    "starts_at": "2026-08-03T09:00:00Z"
  }
]
POST/sessionsCreate a session
Parameters
NameTypeIn
title · requiredstringbody
lab_version_id · requireduuidbody
capacity · requiredintegerbody
starts_attimestamp (ISO 8601)body
Request
bash
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
json
{
  "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
NameTypeIn
sessionId · requireduuidpath
Request
bash
curl -X GET https://edushell.app/api/v1/sessions/{sessionId} \
  -H "Authorization: Bearer esk_..."
Response 200
json
{
  "id": "9b1f0e2d-3c4b-5a69-8778-6d5c4b3a2f10",
  "title": "Kubernetes 101, cohort A",
  "state": "running",
  "capacity": 12,
  "participants": 9
}
DELETE/sessions/{sessionId}Delete a session
Parameters
NameTypeIn
sessionId · requireduuidpath
Request
bash
curl -X DELETE https://edushell.app/api/v1/sessions/{sessionId} \
  -H "Authorization: Bearer esk_..."
Response 204
POST/sessions/{sessionId}/join-codeRotate the join code
Parameters
NameTypeIn
sessionId · requireduuidpath
Request
bash
curl -X POST https://edushell.app/api/v1/sessions/{sessionId}/join-code \
  -H "Authorization: Bearer esk_..."
Response 200
json
{
  "join_code": "TIGER-42"
}

Labs

GET/labsList labs
Request
bash
curl -X GET https://edushell.app/api/v1/labs \
  -H "Authorization: Bearer esk_..."
Response 200
json
[
  {
    "id": "2f3a4b5c-6d7e-8f90-a1b2-c3d4e5f6a7b8",
    "name": "Kubernetes 101",
    "tier": "cluster"
  }
]
GET/labs/{labId}/versionsList a lab's versions
Parameters
NameTypeIn
labId · requireduuidpath
Request
bash
curl -X GET https://edushell.app/api/v1/labs/{labId}/versions \
  -H "Authorization: Bearer esk_..."
Response 200
json
[
  {
    "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-keysList API keys
Parameters
NameTypeIn
orgId · requireduuidpath
Request
bash
curl -X GET https://edushell.app/api/v1/orgs/{orgId}/api-keys \
  -H "Authorization: Bearer esk_..."
Response 200
json
[
  {
    "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-keysCreate an API key
Parameters
NameTypeIn
orgId · requireduuidpath
name · requiredstringbody
role · requiredstring (admin | trainer)body
Request
bash
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
json
{
  "id": "b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e",
  "key": "esk_9f2a1c7d4b8e6a3f2c1d0e9b8a7c6d5e",
  "prefix": "esk_9f2a1c",
  "role": "trainer"
}
GET/orgs/{orgId}/webhooksList webhook endpoints
Parameters
NameTypeIn
orgId · requireduuidpath
Request
bash
curl -X GET https://edushell.app/api/v1/orgs/{orgId}/webhooks \
  -H "Authorization: Bearer esk_..."
Response 200
json
[
  {
    "id": "c3d4e5f6-a7b8-9c0d-1e2f-3a4b5c6d7e8f",
    "url": "https://example.com/webhooks/edushell",
    "event_types": [
      "member.removed",
      "org.closed"
    ]
  }
]
POST/orgs/{orgId}/webhooksCreate a webhook endpoint
Parameters
NameTypeIn
orgId · requireduuidpath
url · requiredstring (https)body
event_types · requiredstring[]body
descriptionstringbody
Request
bash
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
json
{
  "id": "c3d4e5f6-a7b8-9c0d-1e2f-3a4b5c6d7e8f",
  "url": "https://example.com/webhooks/edushell",
  "event_types": [
    "member.removed",
    "org.closed"
  ],
  "secret": "whsec_4b8e6a3f2c1d0e9b8a7c6d5e4f3a2b1c"
}