PHP2Shell: Is Your Joomla Site Safe? What to Do Today Introducing Next Boards: Kanban project and task boards for Joomla Next Exams 6.2.0: Exam Studio, six visual question types, exam embeds and six new languages Building the Future of Joomla Extensions
NextSoftware

List Attempts

GET /v1/nextexams/attempts

List attempts

Attempts, newest first. Scope attempts:read; the role needs attempts.view.

Request

GET https://your-site.example/api/index.php/v1/nextexams/attempts?limit=<integer>&offset=<integer>&search=<string>&exam_id=<integer>&status=<string>

Parameters

Name Type In Required Description
limit integer query No Page size. (min 1) Defaults to 20.
offset integer query No Rows to skip. (min 0) Defaults to 0.
search string query No Matches the title (and, for questions, the stem).
exam_id integer query No Only attempts at this exam. (min 1)
status string query No Only attempts in this state. One of in_progress, submitted, graded, locked_review, abandoned.

Responses

200 — A page of attempts.

{
    "data": [
        {
            "id": 1,
            "exam_id": 1,
            "exam_title": "string",
            "user_id": 1,
            "user_name": "string",
            "guest_name": "string",
            "guest_email": "string",
            "attempt_number": 1,
            "status": "in_progress",
            "started": "2026-01-01T12:00:00Z",
            "submitted": "2026-01-01T12:00:00Z",
            "expires_at": "2026-01-01T12:00:00Z",
            "time_spent": 1,
            "score": 1.5,
            "max_score": 1.5,
            "percent": 1.5,
            "passed": true,
            "is_graded": true
        }
    ],
    "meta": {
        "total": 1
    }
}
Field Type Meaning
data[].id integer
data[].exam_id integer
data[].exam_title string|null
data[].user_id integer|null Null for a guest.
data[].user_name string|null
data[].guest_name string|null
data[].guest_email string|null
data[].attempt_number integer
data[].status string One of in_progress, submitted, graded, locked_review, abandoned.
data[].started string|null ISO 8601 in UTC, or null when not set. (date-time)
data[].submitted string|null ISO 8601 in UTC, or null when not set. (date-time)
data[].expires_at string|null ISO 8601 in UTC, or null when not set. (date-time)
data[].time_spent integer|null Seconds.
data[].score number|null
data[].max_score number|null
data[].percent number|null
data[].passed boolean|null
data[].is_graded boolean False while a question still waits for a person to grade it.
meta.total integer Matching records in all pages.

Errors

Status Code When
401 INVALID_TOKEN No token (MISSING_TOKEN), or one that is wrong, expired, revoked, or whose owner can no longer sign in (INVALID_TOKEN).
403 MISSING_SCOPE The token is valid but this request is not allowed, and code says why: MISSING_SCOPE (the token lacks the scope), FORBIDDEN (the owner's role does not allow it), ACCESS_DENIED (the owner cannot manage Next Exams), API_DISABLED (the API Tokens app is off), APP_DISABLED (the feature's app is off — meta.app names it), ACCOUNT_UNUSABLE (the owner is blocked or must reset their password), DEMO_LOCKED (a demo site).

Examples

curl

curl -s "https://your-site.example/api/index.php/v1/nextexams/attempts" \
  -H "Authorization: Bearer $API_TOKEN"

PHP

<?php
$ch = curl_init('https://your-site.example/api/index.php/v1/nextexams/attempts?limit=<integer>&offset=<integer>&search=<string>&exam_id=<integer>&status=<string>');

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . getenv('API_TOKEN'),
    ],
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);

JavaScript

const API_TOKEN = process.env.API_TOKEN;

const response = await fetch("https://your-site.example/api/index.php/v1/nextexams/attempts?limit=<integer>&offset=<integer>&search=<string>&exam_id=<integer>&status=<string>", {
  headers: {
    "Authorization": `Bearer ${API_TOKEN}`,
  },
});
const data = await response.json();

All Extensions