---
title: "Complete a mission or AI Roleplay"
description: "Marks a mission or AI Roleplay module as complete for a specific learner."
contentType: "api-reference"
url: "https://developer.mindtickle.com/docs/training/modules/complete-a-mission-or-ai-roleplay/"
---

## Prerequisites

1. [Authentication and setup](/docs/getting-started/authentication-and-setup/): A valid access token.
2. [Invite users to a module](/docs/training/modules/invite-users-to-a-module/): The learner must be invited to the mission or AI Roleplay.
3. [Assign reviewers to users](/docs/training/modules/assign-reviewers-to-users/): An active reviewer is required. This assignment API supports human reviewers for missions and coaching sessions only. AI or Copilot reviewers cannot be assigned through a public API.

## Endpoint

```http
POST /api/v1/cag/COMPANY_ID/series/SERIES_ID/entity/ENTITY_ID/learner/LEARNER_ID/_complete
```

Replace `COMPANY_ID`, `SERIES_ID`, `ENTITY_ID`, and `LEARNER_ID` with the values in the path parameters table.

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

Headers: `Authorization: Bearer ACCESS_TOKEN`, `Content-Type: application/json`.

## Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `COMPANY_ID` | string | Required | The company ID (CNAME) for your Mindtickle instance. |
| `SERIES_ID` | string | Required | Mindtickle series ID. |
| `ENTITY_ID` | string | Required | Mindtickle module ID for the module, either a mission or an AI Roleplay. |
| `LEARNER_ID` | string | Required | Mindtickle user ID for the learner. |

## Request

The request body is optional. Sending an empty JSON object `{}` completes the module with the default score of 100.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `score` | integer | Optional | The score to assign. Must be `0` or `100`. Default: `100` (pass). |

### Request example

A JSON body specifying the score:

```json
{
  "score": 100
}
```

## Response

The completion payload is returned under `object`.

| Field | Type | Description |
| --- | --- | --- |
| `requestId` | string | Unique tracking identifier for the request. |
| `object` | object | The completion payload containing the module and learner details. |
| `object.entity_id` | string | The identifier of the module, either a mission or an AI Roleplay, that was completed. |
| `object.learner_id` | string | The identifier for the learner. |
| `object.series_id` | string | The series ID the module belongs to. |
| `object.score` | integer | The final score applied, `0` or `100`. |
| `object.completed_at` | integer | Epoch timestamp, in seconds, when the completion occurred. |

### Response example

```json
{
  "requestId": "req_101",
  "stackTrace": null,
  "statusCode": 200,
  "statusMsg": null,
  "object": {
    "entity_id": "1234567890123456101",
    "learner_id": "123456789abcd102",
    "series_id": "1234567890123456103",
    "score": 100,
    "completed_at": 1778846250
  },
  "meta": {}
}
```

## Errors

The JSON `statusCode` is an application code, not necessarily the HTTP status. For HTTP 400 responses, application code `5` means the score must be `0` or `100`; application code `33` means no active reviewer is associated with the assignment.

| Status | Error | Reason |
| --- | --- | --- |
| `400 Bad Request` | Could not resolve a mission type for entityId=ID | The entity has no resolvable mission type. |
| `400 Bad Request` | Failed to resolve mission type: MESSAGE | The mission-type lookup failed for the provided entity ID. |
| `400 Bad Request` | score must be 0 or 100 | The provided score value is invalid. |
| `400 Bad Request` | No active reviewer associated for entityId=ID learnerId=ID | The learner does not have an assigned reviewer for this mission or AI Roleplay. |
| `400 Bad Request` | Could not resolve orgId for companyId=ID | The provided company identifier is invalid. |
| `400 Bad Request` | Reviewer sessionNo unresolved for reviewerId=ID | The system could not determine the session for the assigned reviewer. |
| `400 Bad Request` | Could not resolve NODE_TYPE node for entityId=ID | The evaluation activity node for the mission or AI Roleplay could not be resolved. |
| `500 Internal Server Error` | Unknown exception | A general server-side failure occurred. |

Error example, invalid score:

```json
{
  "requestId": "req_101",
  "stackTrace": null,
  "statusCode": 5,
  "statusMsg": "score must be 0 or 100"
}
```

Error example, no active reviewer:

```json
{
  "requestId": "req_101",
  "stackTrace": null,
  "statusCode": 33,
  "statusMsg": "No active reviewer associated for entityId=1234567890123456101 learnerId=123456789abcd102 \u2014 cannot complete mission"
}
```

## Notes

- **Completion flow:** The API starts the learner session, initializes a draft, attaches media, submits the learner activity, and submits the reviewer evaluation for all active reviewers associated with the learner.
- **Supported module types:** The API completes missions and AI Roleplays. A single dispatcher endpoint resolves the module type from the entity ID and delegates to the matching completion flow, so you do not need to know the module type in advance.
- **Mission, email and task evaluation:** Learners submit a write-up, such as an email, or upload documents, media, and zipped files as a task. The review is done by the reviewers you appoint.
- **Mission, screen capture:** Learners record their narration or video over a screen-share demo. The review is done by the reviewers you appoint.
- **Mission, voice-over slideshow:** Learners record their narration over a slideshow. The review is done by the reviewers you appoint.
- **Mission, video roleplay:** Learners record their video directly through Mindtickle or upload a pre-recorded video. The review is done by the reviewers you appoint.
- **AI Roleplay:** Learners complete an AI Roleplay scenario. The review is done by the reviewers you appoint, including Mindtickle Copilot for AI-powered reviews.
- **Email and task evaluation shortcut:** For email and task evaluation missions specifically, you can also call `POST /api/v1/cag/COMPANY_ID/series/SERIES_ID/entity/ENTITY_ID/learner/LEARNER_ID/email/_complete`, which completes the mission directly without the mission-type resolution step.
- **Silent completion:** The API bypasses manual reviewer workflows by automatically starting and submitting reviewer evaluations for all active reviewers associated with the learner. The result is a silent completion: no pending review tasks are generated and no automated email notifications are triggered for either the learner or the reviewer.
- **Draft and media:** To keep data valid and prevent workflow failures, a draft is initialized and a static media placeholder is attached. The module then has the required artifact for status changes, and no external media upload is needed.
- **Downstream effects:** Recording the completion triggers series unlocking and certification eligibility immediately.
- **Audit:** Every completion processed through this API carries a `completion_origin` tag labeled `external_completion_api`, visible in analytics to distinguish these from organic submissions.
- **Learner view:** The module transitions to a Completed status. The submission view displays a placeholder note, `Externally reported completion`, instead of a standard media file.
- **Scoring:** Only binary scoring, `0` or `100`, is supported. Granular rubric-level grading is not available.
- **Reviewer assignments:** An active reviewer must be assigned to the learner for the mission or AI Roleplay before you call this API.
- **Progress states:** The API is for final completion only. It does not support in-progress states.
- **Media limits:** While a static artifact is attached for data integrity, the API does not support uploading unique external videos or PDFs.
- **Use case:** The endpoint synchronizes data from external partner portals or third-party certification sites, so the platform remains the central system of record for all readiness data.

## Related

- [Complete a module for a user](/docs/training/modules/complete-a-module-for-a-user/): Complete a course, quick update, or assessment for a user.
- [Migrate mission learner data](/docs/training/modules/migrate-mission-learner-data/): Move mission progress from one user ID to another.
