---
title: "Get learner progress statements"
description: "Returns xAPI statements for a learner, showing their progress state for each Mindtickle module they are tracked against."
contentType: "api-reference"
url: "https://developer.mindtickle.com/docs/xapi/statements/get-learner-progress-statements/"
---

## Prerequisites

1. [Authentication and setup](/docs/getting-started/authentication-and-setup/): A valid access token.

## Endpoint

```http
GET /services/data/v4.0/xapi/statements
```

Base URL: the standard REST host for your region. See [Base URLs](/docs/getting-started/authentication-and-setup/#base-urls).

Headers: `Authorization: Bearer ACCESS_TOKEN`.

## Query parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `agent` | string | Required | The Mindtickle learner, the xAPI agent, whose records you want to retrieve. Pass a URL-encoded JSON object whose `mbox` value is a full mailto IRI. See Notes. |
| `verb` | string | Optional | Filters by module status. Values: `not_started` when the learner has not begun the module, `in_progress` when the learner has started but not completed it, and `completed` when the learner has completed it. |
| `limit` | integer | Optional | Maximum number of statements to return in the current page. Use it to break large data sets into smaller chunks, then use the `more` URL in the response to fetch the next page. |

## Request

This endpoint has no request body.

### Request example

```http
GET https://api.prod-us.mindtickle.com/services/data/v4.0/xapi/statements?agent=%7B%22mbox%22%3A%22mailto%3Aalex.fry%40example.com%22%7D&limit=2&verb=not_started
```

## Response

The API returns a JSON object with statement results and a continuation cursor if more data is available.

| Field | Type | Description |
| --- | --- | --- |
| `statements` | array | A list of xAPI statement objects representing individual learner activities. |
| `statements[].id` | string | The unique identifier for this specific learning record. |
| `statements[].actor` | object | The Mindtickle learner performing the action, including their name in `name` and email address or username in `mbox`. |
| `statements[].verb` | object | The status update or action recorded for the learner. The `display` field shows the current progress state: `not_started`, `in_progress`, or `completed`. |
| `statements[].object` | object | The Mindtickle activity being tracked, including the module ID in `id`, the module name in `definition.name`, and the module type in `definition.type`, for example ILT, course, or quick update. |
| `statements[].timestamp` | string | The exact date and time the learner reached this progress state, in ISO 8601 format. |
| `statements[].stored` | string | The date and time this record was saved in Mindtickle, in ISO 8601 format. |
| `more` | string | A continuation URL with `more_id`. Provided when there are more results than the current page limit. To fetch the next set of records, make a GET request to this exact URL without modification. |

### Response example

This standalone example illustrates statement fields for two learners. It is independent of the single-learner request above. Email addresses are fictional, and `CONTINUATION_URL` is a placeholder.

```json
{
  "statements": [
    {
      "id": "123456789abcd101_123456789012345102",
      "actor": {
        "name": "Alex Fry",
        "mbox": "mailto:alex.fry@example.com"
      },
      "verb": {
        "id": "http://adlnet.gov/expapi/verbs/not_started",
        "display": { "en-US": "not_started" }
      },
      "object": {
        "id": "123456789012345102",
        "definition": {
          "name": { "en-US": "SESSION WITHIN EVENT" },
          "type": "http://adlnet.gov/expapi/activities/ilt"
        }
      },
      "timestamp": "2025-07-31T08:37:12.572Z",
      "stored": "2025-07-31T08:37:12.572Z"
    },
    {
      "id": "123456789abcd101_123456789012345103",
      "actor": {
        "name": "Anna Cruz",
        "mbox": "mailto:anna.cruz@example.com"
      },
      "verb": {
        "id": "http://adlnet.gov/expapi/verbs/not_started",
        "display": { "en-US": "not_started" }
      },
      "object": {
        "id": "123456789012345103",
        "definition": {
          "name": { "en-US": "SESSION_EVENT" },
          "type": "http://adlnet.gov/expapi/activities/ilt"
        }
      },
      "timestamp": "2025-07-31T08:37:12.573Z",
      "stored": "2025-07-31T08:37:12.573Z"
    }
  ],
  "more": "CONTINUATION_URL"
}
```

## Notes

- **Agent parameter encoding:** Always URL-encode the agent JSON. For example, `agent={"mbox":"mailto:alex.fry@example.com"}` becomes `%7B%22mbox%22%3A%22mailto%3Aalex.fry%40example.com%22%7D`. Incorrect encoding is a common source of 4xx errors, and the `mbox` value must be a full mailto IRI such as `mailto:user@example.com`.
- **Pagination:** When the response includes `more`, make another GET request to that exact URL, including the encoded `more_id`, and continue until `more` is absent or empty. Do not re-apply the original query parameters when using the continuation URL.
- **Best practices:** Use `limit` to manage payload size and iterate with `more` for full result sets, store processed statement IDs to help deduplicate records during synchronization, and validate timestamps in ISO 8601 format, using `stored` for ordering when reconstructing event timelines.
- **Synchronization:** Do not use a saved statement ID as a continuation cursor or assume a stable result order. Confirm incremental retrieval requirements with [Mindtickle Support](mailto:support@mindtickle.com) before implementing synchronization.
- **Compatibility:** Validate the response against your target LRS before importing it, including the composite statement IDs and numeric activity IDs illustrated above.
- **Troubleshooting:** If no results are returned, confirm the agent is correctly URL-encoded and exists in the tenant, and try removing the `verb` filter to broaden the search.
