{
    "info": {
        "_postman_id": "e48f5cec-34dc-5891-8e94-2b33aa5d6a04",
        "name": "Next Exams REST API (docs v6)",
        "description": "The integration surface for Next Exams: subjects, tags and questions you can\ncreate and edit, exams you can read, publish and delete, attempts and per-exam\nreports you can read — enough to sync a question bank from another system, feed\na gradebook or a BI tool, or automate publishing.\n\n**Authentication.** Every request carries a Next Exams API token, created under\n*Next Exams → API tokens*. A token is shown once and stored only as a hash. It\nacts as the user who created it, and is limited three ways at once: by the\nscopes it was given, by that user's Next Exams role, and by Joomla's\n`core.manage` permission on Next Exams. A scope a token lacks is refused with\n`403 MISSING_SCOPE`, whatever the role allows.\n\n**It is off when the API Tokens app is off.** *Next Exams → App Manager →\nAPI tokens* is the kill switch: with it off, every request answers\n`403 API_DISABLED`. Apps that are switched off answer `403 APP_DISABLED`.\n\nResponses are projections, not table rows: each resource returns exactly the\nfields documented here, with real booleans and numbers, and dates as ISO 8601\nin UTC. Secrets the administrator screens carry — a guest's result token, an\nexam's access code — are never returned.",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "variable": [
        {
            "key": "baseUrl",
            "value": "https://your-site.example/api/index.php",
            "type": "string"
        },
        {
            "key": "apiToken",
            "value": "",
            "type": "string"
        }
    ],
    "item": [
        {
            "name": "Subjects",
            "item": [
                {
                    "name": "GET List Subjects",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/subjects?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "subjects"
                            ],
                            "query": [
                                {
                                    "key": "limit",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "offset",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "search",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "published",
                                    "value": "",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "List subjects\n\nSubjects in tree order, paged. Scope `subjects:read`."
                    },
                    "response": [
                        {
                            "name": "200 A page of subjects.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/subjects?",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "subjects"
                                    ],
                                    "query": [
                                        {
                                            "key": "limit",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "offset",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "search",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "published",
                                            "value": "",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "List subjects\n\nSubjects in tree order, paged. Scope `subjects:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"parent_id\": 1,\n            \"path\": \"string\",\n            \"level\": 1,\n            \"code\": \"string\",\n            \"title\": \"string\",\n            \"alias\": \"string\",\n            \"description\": \"string\",\n            \"ordering\": 1,\n            \"published\": true,\n            \"created\": \"2026-01-01T12:00:00Z\",\n            \"modified\": \"2026-01-01T12:00:00Z\"\n        }\n    ],\n    \"meta\": {\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "POST Create Subject",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/subjects",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "subjects"
                            ]
                        },
                        "description": "Create a subject\n\nScope `subjects:write`; the role needs `subjects.create`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"title\": \"Algebra\",\n    \"parent_id\": 0,\n    \"code\": \"MATH-ALG\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "201 Created. `data.id` is the new record.",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/subjects",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "subjects"
                                    ]
                                },
                                "description": "Create a subject\n\nScope `subjects:write`; the role needs `subjects.create`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"title\": \"Algebra\",\n    \"parent_id\": 0,\n    \"code\": \"MATH-ALG\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "201",
                            "code": 201,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "GET Get Subject",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/subjects/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "subjects",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Get a subject\n\nScope `subjects:read`."
                    },
                    "response": [
                        {
                            "name": "200 The subject.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/subjects/:id",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "subjects",
                                        ":id"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Get a subject\n\nScope `subjects:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"parent_id\": 1,\n        \"path\": \"string\",\n        \"level\": 1,\n        \"code\": \"string\",\n        \"title\": \"string\",\n        \"alias\": \"string\",\n        \"description\": \"string\",\n        \"ordering\": 1,\n        \"published\": true,\n        \"created\": \"2026-01-01T12:00:00Z\",\n        \"modified\": \"2026-01-01T12:00:00Z\"\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "PATCH Update Subject",
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/subjects/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "subjects",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Update a subject\n\nChanges only the fields you send. Moving a subject (`parent_id`) rebuilds\nthe path of its whole subtree; a move under its own descendant is refused.\nScope `subjects:write`; the role needs `subjects.edit`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"title\": \"Linear algebra\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 Saved.",
                            "originalRequest": {
                                "method": "PATCH",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/subjects/:id",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "subjects",
                                        ":id"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Update a subject\n\nChanges only the fields you send. Moving a subject (`parent_id`) rebuilds\nthe path of its whole subtree; a move under its own descendant is refused.\nScope `subjects:write`; the role needs `subjects.edit`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"title\": \"Linear algebra\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "DELETE Delete Subject",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/subjects/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "subjects",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Delete a subject\n\nScope `subjects:delete`; the role needs `subjects.delete`."
                    }
                },
                {
                    "name": "POST Set Subject Status",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/subjects/:id/status",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "subjects",
                                ":id",
                                "status"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Publish or unpublish a subject\n\nScope `subjects:write`; the role needs `subjects.edit`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"published\": true\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 The new state.",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/subjects/:id/status",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "subjects",
                                        ":id",
                                        "status"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Publish or unpublish a subject\n\nScope `subjects:write`; the role needs `subjects.edit`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"published\": true\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"published\": true\n    }\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Tags",
            "item": [
                {
                    "name": "GET List Tags",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/tags?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "tags"
                            ],
                            "query": [
                                {
                                    "key": "limit",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "offset",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "search",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "published",
                                    "value": "",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "List tags\n\nScope `questions:read`."
                    },
                    "response": [
                        {
                            "name": "200 A page of tags.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/tags?",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "tags"
                                    ],
                                    "query": [
                                        {
                                            "key": "limit",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "offset",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "search",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "published",
                                            "value": "",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "List tags\n\nScope `questions:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"title\": \"string\",\n            \"alias\": \"string\",\n            \"ordering\": 1,\n            \"published\": true,\n            \"created\": \"2026-01-01T12:00:00Z\",\n            \"modified\": \"2026-01-01T12:00:00Z\"\n        }\n    ],\n    \"meta\": {\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "POST Create Tag",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/tags",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "tags"
                            ]
                        },
                        "description": "Create a tag\n\nScope `questions:write`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"title\": \"Calculator allowed\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "201 Created. `data.id` is the new record.",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/tags",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "tags"
                                    ]
                                },
                                "description": "Create a tag\n\nScope `questions:write`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"title\": \"Calculator allowed\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "201",
                            "code": 201,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "GET Get Tag",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/tags/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "tags",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Get a tag\n\nScope `questions:read`."
                    },
                    "response": [
                        {
                            "name": "200 The tag.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/tags/:id",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "tags",
                                        ":id"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Get a tag\n\nScope `questions:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"title\": \"string\",\n        \"alias\": \"string\",\n        \"ordering\": 1,\n        \"published\": true,\n        \"created\": \"2026-01-01T12:00:00Z\",\n        \"modified\": \"2026-01-01T12:00:00Z\"\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "PATCH Update Tag",
                    "request": {
                        "method": "PATCH",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/tags/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "tags",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Update a tag\n\nChanges only the fields you send. Scope `questions:write`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"title\": \"string\",\n    \"alias\": \"string\",\n    \"published\": 0\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 Saved.",
                            "originalRequest": {
                                "method": "PATCH",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/tags/:id",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "tags",
                                        ":id"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Update a tag\n\nChanges only the fields you send. Scope `questions:write`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"title\": \"string\",\n    \"alias\": \"string\",\n    \"published\": 0\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "DELETE Delete Tag",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/tags/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "tags",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Delete a tag\n\nRemoves the tag from every question that carries it. Scope `questions:delete`."
                    }
                },
                {
                    "name": "POST Set Tag Status",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/tags/:id/status",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "tags",
                                ":id",
                                "status"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Publish or unpublish a tag\n\nScope `questions:write`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"published\": true\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 The new state.",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/tags/:id/status",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "tags",
                                        ":id",
                                        "status"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Publish or unpublish a tag\n\nScope `questions:write`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"published\": true\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"published\": true\n    }\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Questions",
            "item": [
                {
                    "name": "GET List Questions",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/questions?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "questions"
                            ],
                            "query": [
                                {
                                    "key": "limit",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "offset",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "search",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "published",
                                    "value": "",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "List bank questions\n\nThe question bank, paged. Questions that are private to one exam (made\nthere with *Keep in bank* off) and retired versions are not listed.\nScope `questions:read`."
                    },
                    "response": [
                        {
                            "name": "200 A page of questions.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/questions?",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "questions"
                                    ],
                                    "query": [
                                        {
                                            "key": "limit",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "offset",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "search",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "published",
                                            "value": "",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "List bank questions\n\nThe question bank, paged. Questions that are private to one exam (made\nthere with *Keep in bank* off) and retired versions are not listed.\nScope `questions:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"subject_id\": 1,\n            \"question_type\": \"string\",\n            \"title\": \"string\",\n            \"alias\": \"string\",\n            \"stem\": \"string\",\n            \"explanation\": \"string\",\n            \"difficulty\": 1,\n            \"default_points\": 1.5,\n            \"answer_key\": {},\n            \"shuffle_options\": true,\n            \"published\": true,\n            \"version\": 1,\n            \"approval_status\": \"approved\",\n            \"owner_exam_id\": 1,\n            \"created\": \"2026-01-01T12:00:00Z\",\n            \"modified\": \"2026-01-01T12:00:00Z\",\n            \"exam_count\": 1\n        }\n    ],\n    \"meta\": {\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "POST Create Question",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/questions",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "questions"
                            ]
                        },
                        "description": "Create a question\n\nCreates a bank question. `question_type` is one of the values\n`GET /v1/nextexams/question-types` returns; choice types carry `options`\n(mark the right one with `is_correct`), the others an `answer_key`.\nScope `questions:write`; the role needs `questions.create`. Creating a\nquestion private to an exam (`owner_exam_id`) also needs `exams:write`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"title\": \"Two plus two\",\n    \"question_type\": \"mcq_single\",\n    \"stem\": \"<p>What is 2 + 2?</p>\",\n    \"default_points\": 1,\n    \"difficulty\": 1,\n    \"options\": [\n        {\n            \"option_text\": \"3\",\n            \"is_correct\": false\n        },\n        {\n            \"option_text\": \"4\",\n            \"is_correct\": true\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "201 Created. `data.id` is the new record.",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/questions",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "questions"
                                    ]
                                },
                                "description": "Create a question\n\nCreates a bank question. `question_type` is one of the values\n`GET /v1/nextexams/question-types` returns; choice types carry `options`\n(mark the right one with `is_correct`), the others an `answer_key`.\nScope `questions:write`; the role needs `questions.create`. Creating a\nquestion private to an exam (`owner_exam_id`) also needs `exams:write`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"title\": \"Two plus two\",\n    \"question_type\": \"mcq_single\",\n    \"stem\": \"<p>What is 2 + 2?</p>\",\n    \"default_points\": 1,\n    \"difficulty\": 1,\n    \"options\": [\n        {\n            \"option_text\": \"3\",\n            \"is_correct\": false\n        },\n        {\n            \"option_text\": \"4\",\n            \"is_correct\": true\n        }\n    ]\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "201",
                            "code": 201,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "GET Get Question",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/questions/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "questions",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Get a question\n\nThe whole question: options with their stable ids, answer key, tags and\nwhere it is used. The body of this response is a valid `PUT` body.\nScope `questions:read`."
                    },
                    "response": [
                        {
                            "name": "200 The question.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/questions/:id",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "questions",
                                        ":id"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Get a question\n\nThe whole question: options with their stable ids, answer key, tags and\nwhere it is used. The body of this response is a valid `PUT` body.\nScope `questions:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"subject_id\": 1,\n        \"question_type\": \"string\",\n        \"title\": \"string\",\n        \"alias\": \"string\",\n        \"stem\": \"string\",\n        \"explanation\": \"string\",\n        \"difficulty\": 1,\n        \"default_points\": 1.5,\n        \"answer_key\": {},\n        \"shuffle_options\": true,\n        \"published\": true,\n        \"version\": 1,\n        \"approval_status\": \"string\",\n        \"owner_exam_id\": 1,\n        \"created\": \"2026-01-01T12:00:00Z\",\n        \"modified\": \"2026-01-01T12:00:00Z\",\n        \"options\": [\n            {\n                \"id\": 1,\n                \"ordering\": 1,\n                \"option_text\": \"string\",\n                \"is_correct\": true,\n                \"match_key\": \"string\",\n                \"feedback\": \"string\"\n            }\n        ],\n        \"tags\": [\n            {\n                \"id\": 1,\n                \"title\": \"string\"\n            }\n        ],\n        \"usage\": {\n            \"exam_count\": 1,\n            \"answered\": true\n        }\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "PUT Replace Question",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/questions/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "questions",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Replace a question\n\n**A question is saved whole**: options, answer key and tags you leave out\nare removed. Read it, change what you need, send it back. A body with no\n`options` key is refused with `422 OPTIONS_REQUIRED` while the question\nhas options — send `[]` to remove them deliberately.\n\nOption ids survive a save: send each option's `id` back and answers already\ngiven to it keep grading. A change that would alter how existing answers\nare graded is refused with `409 ANSWERED_NEEDS_VERSION` unless the body\ncarries `new_version`. Send `expected_version` to be refused with\n`409 STALE` if someone saved in between.\n\nScope `questions:write`; the role needs `questions.edit`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"title\": \"string\",\n    \"question_type\": \"string\",\n    \"stem\": \"string\",\n    \"explanation\": \"string\",\n    \"subject_id\": 1,\n    \"difficulty\": 1,\n    \"default_points\": 1.5,\n    \"shuffle_options\": true,\n    \"published\": true,\n    \"options\": [\n        {\n            \"id\": 1,\n            \"option_text\": \"string\",\n            \"is_correct\": true,\n            \"match_key\": \"string\",\n            \"feedback\": \"string\"\n        }\n    ],\n    \"answer_key\": {},\n    \"tags\": [\n        \"string\"\n    ],\n    \"owner_exam_id\": 1,\n    \"expected_version\": 1,\n    \"new_version\": {\n        \"exam_ids\": [\n            1\n        ]\n    }\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 Saved.",
                            "originalRequest": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/questions/:id",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "questions",
                                        ":id"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Replace a question\n\n**A question is saved whole**: options, answer key and tags you leave out\nare removed. Read it, change what you need, send it back. A body with no\n`options` key is refused with `422 OPTIONS_REQUIRED` while the question\nhas options — send `[]` to remove them deliberately.\n\nOption ids survive a save: send each option's `id` back and answers already\ngiven to it keep grading. A change that would alter how existing answers\nare graded is refused with `409 ANSWERED_NEEDS_VERSION` unless the body\ncarries `new_version`. Send `expected_version` to be refused with\n`409 STALE` if someone saved in between.\n\nScope `questions:write`; the role needs `questions.edit`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"title\": \"string\",\n    \"question_type\": \"string\",\n    \"stem\": \"string\",\n    \"explanation\": \"string\",\n    \"subject_id\": 1,\n    \"difficulty\": 1,\n    \"default_points\": 1.5,\n    \"shuffle_options\": true,\n    \"published\": true,\n    \"options\": [\n        {\n            \"id\": 1,\n            \"option_text\": \"string\",\n            \"is_correct\": true,\n            \"match_key\": \"string\",\n            \"feedback\": \"string\"\n        }\n    ],\n    \"answer_key\": {},\n    \"tags\": [\n        \"string\"\n    ],\n    \"owner_exam_id\": 1,\n    \"expected_version\": 1,\n    \"new_version\": {\n        \"exam_ids\": [\n            1\n        ]\n    }\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "DELETE Delete Question",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/questions/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "questions",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Delete a question\n\nA question an exam still uses is refused with `409 QUESTION_IN_USE`, naming\nthe exams in `meta`. One that only past attempts reference is retired\ninstead of deleted, so those attempts keep their record.\nScope `questions:delete`; the role needs `questions.delete`."
                    }
                },
                {
                    "name": "POST Set Question Status",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/questions/:id/status",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "questions",
                                ":id",
                                "status"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Publish or unpublish a question\n\nScope `questions:write`; the role needs `questions.edit`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"published\": true\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 The new state.",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/questions/:id/status",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "questions",
                                        ":id",
                                        "status"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Publish or unpublish a question\n\nScope `questions:write`; the role needs `questions.edit`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"published\": true\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"published\": true\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "GET List Question Versions",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/questions/:id/versions",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "questions",
                                ":id",
                                "versions"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "List a question's versions\n\nEvery saved version, newest first, each with a snapshot of the question as it was. Scope `questions:read`."
                    },
                    "response": [
                        {
                            "name": "200 The versions.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/questions/:id/versions",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "questions",
                                        ":id",
                                        "versions"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "List a question's versions\n\nEvery saved version, newest first, each with a snapshot of the question as it was. Scope `questions:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"version\": 1,\n            \"author\": \"string\",\n            \"created\": \"2026-01-01T12:00:00Z\",\n            \"snapshot\": {}\n        }\n    ]\n}"
                        }
                    ]
                },
                {
                    "name": "GET List Question Types",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/question-types",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "question-types"
                            ]
                        },
                        "description": "List question types\n\nThe values `question_type` accepts on this site, with their labels in the site language. Scope `lookups:read`."
                    },
                    "response": [
                        {
                            "name": "200 The question types.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/question-types",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "question-types"
                                    ]
                                },
                                "description": "List question types\n\nThe values `question_type` accepts on this site, with their labels in the site language. Scope `lookups:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"value\": \"mcq_single\",\n            \"label\": \"Multiple choice (single answer)\"\n        }\n    ]\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Exams",
            "item": [
                {
                    "name": "GET List Exams",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/exams?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "exams"
                            ],
                            "query": [
                                {
                                    "key": "limit",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "offset",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "search",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "published",
                                    "value": "",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "List exams\n\nScope `exams:read`."
                    },
                    "response": [
                        {
                            "name": "200 A page of exams.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/exams?",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "exams"
                                    ],
                                    "query": [
                                        {
                                            "key": "limit",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "offset",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "search",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "published",
                                            "value": "",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "List exams\n\nScope `exams:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"title\": \"string\",\n            \"alias\": \"string\",\n            \"description\": \"string\",\n            \"intro\": \"string\",\n            \"subject_id\": 1,\n            \"published\": true,\n            \"attempt_mode\": \"exam\",\n            \"layout\": \"single_page\",\n            \"time_limit\": 1,\n            \"max_attempts\": 1,\n            \"pass_mark\": 1.5,\n            \"shuffle_questions\": true,\n            \"shuffle_options\": true,\n            \"access_type\": \"open\",\n            \"result_release\": \"immediate\",\n            \"release_at\": \"2026-01-01T12:00:00Z\",\n            \"show_answers\": true,\n            \"open_from\": \"2026-01-01T12:00:00Z\",\n            \"open_until\": \"2026-01-01T12:00:00Z\",\n            \"cooldown_minutes\": 1,\n            \"allow_pause\": true,\n            \"track_integrity\": true,\n            \"certificate_template_id\": 1,\n            \"created\": \"2026-01-01T12:00:00Z\",\n            \"modified\": \"2026-01-01T12:00:00Z\",\n            \"question_count\": 1\n        }\n    ],\n    \"meta\": {\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "GET Get Exam",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/exams/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "exams",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Get an exam\n\nThe exam's settings and its structure — sections, the questions placed in them and the random-draw rules. Scope `exams:read`."
                    },
                    "response": [
                        {
                            "name": "200 The exam.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/exams/:id",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "exams",
                                        ":id"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Get an exam\n\nThe exam's settings and its structure — sections, the questions placed in them and the random-draw rules. Scope `exams:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"title\": \"string\",\n        \"alias\": \"string\",\n        \"description\": \"string\",\n        \"intro\": \"string\",\n        \"subject_id\": 1,\n        \"published\": true,\n        \"attempt_mode\": \"exam\",\n        \"layout\": \"single_page\",\n        \"time_limit\": 1,\n        \"max_attempts\": 1,\n        \"pass_mark\": 1.5,\n        \"shuffle_questions\": true,\n        \"shuffle_options\": true,\n        \"access_type\": \"open\",\n        \"result_release\": \"immediate\",\n        \"release_at\": \"2026-01-01T12:00:00Z\",\n        \"show_answers\": true,\n        \"open_from\": \"2026-01-01T12:00:00Z\",\n        \"open_until\": \"2026-01-01T12:00:00Z\",\n        \"cooldown_minutes\": 1,\n        \"allow_pause\": true,\n        \"track_integrity\": true,\n        \"certificate_template_id\": 1,\n        \"created\": \"2026-01-01T12:00:00Z\",\n        \"modified\": \"2026-01-01T12:00:00Z\",\n        \"in_progress_attempts\": 1,\n        \"sections\": [\n            {\n                \"id\": 1,\n                \"title\": \"string\",\n                \"description\": \"string\",\n                \"ordering\": 1,\n                \"section_type\": \"fixed\",\n                \"points_per_question\": 1.5,\n                \"questions\": [\n                    {\n                        \"question_id\": 1,\n                        \"ordering\": 1,\n                        \"points\": 1.5,\n                        \"question_title\": \"string\",\n                        \"question_type\": \"string\"\n                    }\n                ],\n                \"pool_rules\": [\n                    {\n                        \"id\": 1,\n                        \"subject_id\": 1,\n                        \"difficulty\": 1,\n                        \"question_type\": \"string\",\n                        \"draw_count\": 1,\n                        \"points_per_question\": 1.5\n                    }\n                ]\n            }\n        ]\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "DELETE Delete Exam",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/exams/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "exams",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Delete an exam\n\nScope `exams:delete`; the role needs `exams.delete`."
                    }
                },
                {
                    "name": "POST Set Exam Status",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/exams/:id/status",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "exams",
                                ":id",
                                "status"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Publish or unpublish an exam\n\nScope `exams:publish`; the role needs `exams.publish`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"published\": true\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "200 The new state.",
                            "originalRequest": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    },
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/exams/:id/status",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "exams",
                                        ":id",
                                        "status"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Publish or unpublish an exam\n\nScope `exams:publish`; the role needs `exams.publish`.",
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"published\": true\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                }
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"published\": true\n    }\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Attempts",
            "item": [
                {
                    "name": "GET List Attempts",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/attempts?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "attempts"
                            ],
                            "query": [
                                {
                                    "key": "limit",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "offset",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "search",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "exam_id",
                                    "value": "",
                                    "disabled": true
                                },
                                {
                                    "key": "status",
                                    "value": "",
                                    "disabled": true
                                }
                            ]
                        },
                        "description": "List attempts\n\nAttempts, newest first. Scope `attempts:read`; the role needs `attempts.view`."
                    },
                    "response": [
                        {
                            "name": "200 A page of attempts.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/attempts?",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "attempts"
                                    ],
                                    "query": [
                                        {
                                            "key": "limit",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "offset",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "search",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "exam_id",
                                            "value": "",
                                            "disabled": true
                                        },
                                        {
                                            "key": "status",
                                            "value": "",
                                            "disabled": true
                                        }
                                    ]
                                },
                                "description": "List attempts\n\nAttempts, newest first. Scope `attempts:read`; the role needs `attempts.view`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"exam_id\": 1,\n            \"exam_title\": \"string\",\n            \"user_id\": 1,\n            \"user_name\": \"string\",\n            \"guest_name\": \"string\",\n            \"guest_email\": \"string\",\n            \"attempt_number\": 1,\n            \"status\": \"in_progress\",\n            \"started\": \"2026-01-01T12:00:00Z\",\n            \"submitted\": \"2026-01-01T12:00:00Z\",\n            \"expires_at\": \"2026-01-01T12:00:00Z\",\n            \"time_spent\": 1,\n            \"score\": 1.5,\n            \"max_score\": 1.5,\n            \"percent\": 1.5,\n            \"passed\": true,\n            \"is_graded\": true\n        }\n    ],\n    \"meta\": {\n        \"total\": 1\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "GET Get Attempt",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/attempts/:id",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "attempts",
                                ":id"
                            ],
                            "variable": [
                                {
                                    "key": "id",
                                    "description": "The record's id. (min 1)"
                                }
                            ]
                        },
                        "description": "Get an attempt\n\nThe attempt with every response, how it was graded, and its integrity signals. Scope `attempts:read`."
                    },
                    "response": [
                        {
                            "name": "200 The attempt.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/attempts/:id",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "attempts",
                                        ":id"
                                    ],
                                    "variable": [
                                        {
                                            "key": "id",
                                            "description": "The record's id. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Get an attempt\n\nThe attempt with every response, how it was graded, and its integrity signals. Scope `attempts:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 1,\n        \"exam_id\": 1,\n        \"exam_title\": \"string\",\n        \"user_id\": 1,\n        \"user_name\": \"string\",\n        \"guest_name\": \"string\",\n        \"guest_email\": \"string\",\n        \"attempt_number\": 1,\n        \"status\": \"in_progress\",\n        \"started\": \"2026-01-01T12:00:00Z\",\n        \"submitted\": \"2026-01-01T12:00:00Z\",\n        \"expires_at\": \"2026-01-01T12:00:00Z\",\n        \"time_spent\": 1,\n        \"score\": 1.5,\n        \"max_score\": 1.5,\n        \"percent\": 1.5,\n        \"passed\": true,\n        \"is_graded\": true,\n        \"integrity_signals\": {},\n        \"grader_comment\": \"string\",\n        \"responses\": [\n            {\n                \"id\": 1,\n                \"question_id\": 1,\n                \"question_type\": \"string\",\n                \"question_title\": \"string\",\n                \"response\": \"string\",\n                \"is_correct\": true,\n                \"points_awarded\": 1.5,\n                \"points_possible\": 1.5,\n                \"auto_graded\": true,\n                \"grader_comment\": \"string\",\n                \"graded_at\": \"2026-01-01T12:00:00Z\"\n            }\n        ]\n    }\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Reports",
            "item": [
                {
                    "name": "GET Get Exam Report",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/reports/:exam_id/overview",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "reports",
                                ":exam_id",
                                "overview"
                            ],
                            "variable": [
                                {
                                    "key": "exam_id",
                                    "description": "The exam to report on. (min 1)"
                                }
                            ]
                        },
                        "description": "Exam overview\n\nPass rate, score distribution and timing over the exam's graded attempts. Scope `reports:read`."
                    },
                    "response": [
                        {
                            "name": "200 The overview.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/reports/:exam_id/overview",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "reports",
                                        ":exam_id",
                                        "overview"
                                    ],
                                    "variable": [
                                        {
                                            "key": "exam_id",
                                            "description": "The exam to report on. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Exam overview\n\nPass rate, score distribution and timing over the exam's graded attempts. Scope `reports:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"attempts\": 1,\n        \"pass_count\": 1,\n        \"pass_rate\": 1.5,\n        \"mean\": 1.5,\n        \"median\": 1.5,\n        \"min\": 1.5,\n        \"max\": 1.5,\n        \"stddev\": 1.5,\n        \"avg_seconds\": 1,\n        \"histogram\": [\n            {\n                \"bucket\": \"40-50\",\n                \"count\": 1\n            }\n        ]\n    }\n}"
                        }
                    ]
                },
                {
                    "name": "GET Get Item Analysis",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/reports/:exam_id/items",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "reports",
                                ":exam_id",
                                "items"
                            ],
                            "variable": [
                                {
                                    "key": "exam_id",
                                    "description": "The exam to report on. (min 1)"
                                }
                            ]
                        },
                        "description": "Item analysis\n\nPer question: how often it was answered right (difficulty) and how well it\nseparates strong from weak candidates (item-total Pearson discrimination).\nScope `reports:read`."
                    },
                    "response": [
                        {
                            "name": "200 One row per question.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/reports/:exam_id/items",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "reports",
                                        ":exam_id",
                                        "items"
                                    ],
                                    "variable": [
                                        {
                                            "key": "exam_id",
                                            "description": "The exam to report on. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Item analysis\n\nPer question: how often it was answered right (difficulty) and how well it\nseparates strong from weak candidates (item-total Pearson discrimination).\nScope `reports:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"question_id\": 1,\n            \"title\": \"string\",\n            \"question_type\": \"string\",\n            \"responses\": 1,\n            \"difficulty\": 1.5,\n            \"correct_rate\": 1.5,\n            \"discrimination\": 1.5,\n            \"avg_seconds\": 1\n        }\n    ]\n}"
                        }
                    ]
                },
                {
                    "name": "GET Get Student Report",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/v1/nextexams/reports/:exam_id/students",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "v1",
                                "nextexams",
                                "reports",
                                ":exam_id",
                                "students"
                            ],
                            "variable": [
                                {
                                    "key": "exam_id",
                                    "description": "The exam to report on. (min 1)"
                                }
                            ]
                        },
                        "description": "Per-student summary\n\nOne row per examinee — attempts, best and average percent, passes. Guests are grouped into one row with no user id. Scope `reports:read`."
                    },
                    "response": [
                        {
                            "name": "200 One row per examinee.",
                            "originalRequest": {
                                "method": "GET",
                                "header": [
                                    {
                                        "key": "Accept",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/v1/nextexams/reports/:exam_id/students",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "v1",
                                        "nextexams",
                                        "reports",
                                        ":exam_id",
                                        "students"
                                    ],
                                    "variable": [
                                        {
                                            "key": "exam_id",
                                            "description": "The exam to report on. (min 1)"
                                        }
                                    ]
                                },
                                "description": "Per-student summary\n\nOne row per examinee — attempts, best and average percent, passes. Guests are grouped into one row with no user id. Scope `reports:read`."
                            },
                            "status": "200",
                            "code": 200,
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"user_id\": 1,\n            \"name\": \"string\",\n            \"attempts\": 1,\n            \"best\": 1.5,\n            \"average\": 1.5,\n            \"passed\": 1\n        }\n    ]\n}"
                        }
                    ]
                }
            ]
        }
    ],
    "auth": {
        "type": "bearer",
        "bearer": [
            {
                "key": "token",
                "value": "{{apiToken}}",
                "type": "string"
            }
        ]
    }
}