Skip to main content
A programme is a tagged group like MPH, MBA, MIT, or MPA. Users belong to one or more programmes (User.programme_codes); case studies declare which programmes may access them (CaseStudy.programme_codes). At runtime, students only see and can start sessions for case studies whose programmes intersect their own — or case studies with an empty programme_codes list (open to all). Programmes are tenant-scoped. Each is identified by a unique uppercase code that frontends and CSV imports use directly — no separate id lookup needed.

List Programmes

GET /v1/console/programmes
Returns all programmes in the tenant. Inactive programmes are included by default — admins typically need to see and manage them. Requires PROGRAMMES.can_view.

Query parameters

skip
integer
default:"0"
Number of records to skip.
limit
integer
default:"50"
Max records to return (1–200).
include_inactive
boolean
default:"true"
Include deactivated programmes.

Example response

{
  "success": true,
  "data": [
    {
      "id": "6651a1b2c3d4e5f6a7b8c9d0",
      "code": "MPH",
      "name": "Master of Public Health",
      "is_active": true,
      "created_at": "2026-04-29T10:00:00Z"
    }
  ],
  "total": 1,
  "page": 1,
  "page_size": 50,
  "total_pages": 1
}

Get Programme

GET /v1/console/programmes/{programme_id}
Requires PROGRAMMES.can_view.

Example response

{
  "success": true,
  "data": {
    "id": "6651a1b2c3d4e5f6a7b8c9d0",
    "code": "MPH",
    "name": "Master of Public Health",
    "description": "Two-year graduate programme in public health.",
    "is_active": true,
    "created_at": "2026-04-29T10:00:00Z",
    "updated_at": null
  }
}

Create Programme

POST /v1/console/programmes
Requires PROGRAMMES.can_create.

Request body

code
string
required
Unique programme code. 1–32 characters, uppercase letters / digits / - / _ only (e.g. MPH, MBA_EXEC).
name
string
required
Display name. Max 255 characters.
description
string
Optional description. Max 2000 characters.
is_active
boolean
default:"true"
Whether the programme is active. Inactive programmes still exist but new users typically aren’t tagged with them.

Example request

curl -X POST https://staging-be.mind.miva.university/v1/console/programmes \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "MPH",
    "name": "Master of Public Health"
  }'

Errors

StatusCodeCondition
409CONFLICTA programme with this code already exists in the tenant.

Update Programme

PATCH /v1/console/programmes/{programme_id}
Partial update. Requires PROGRAMMES.can_edit.

Request body

code
string
Updated code (still must be unique in the tenant).
name
string
Updated display name.
description
string
Updated description.
is_active
boolean
Active status.

Delete Programme

DELETE /v1/console/programmes/{programme_id}
Soft-deletes the programme. Existing users keep the code on their programme_codes list — that field is just a list of strings, so the value persists even after the programme is gone. Deactivate when you want a soft retire; delete when you want it out of the picker. Requires PROGRAMMES.can_delete.