# Read review snapshot

Read a paginated immutable review snapshot for one exact standalone practice record or one completed mock section, including answers, grading facts, evidence anchors, and optional bounded source material for local Agent analysis.

- Capability ID: `review.read_snapshot`
- Operation: `ielts_review_read_snapshot`
- Category: 练习复盘
- Endpoint: `POST /api/v1/agent/capabilities/ielts_review_read_snapshot`
- Authentication: Bearer Token（通过 /api/v1/agent-bindings 绑定账号）
- Required scopes: practice:read
- Side effect: read
- Human documentation: https://ieltsbuddy.igopx.cn/developers/api/ielts_review_read_snapshot

## Request parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `includeMaterial` | boolean | 否 | Include a bounded snapshot of the completed part's original material when local evidence analysis needs it. |
| `limit` | number | 否 | Maximum review items returned in this page. |
| `maxMaterialChars` | number | 否 | Maximum combined characters returned for original material. |
| `offset` | number | 否 | Pagination offset returned by the preceding review call. |
| `scope` | string | 否 | Return incorrect objective items, or every available submitted response. |
| `target` | unknown | 是 | Exact review target returned by review.recent_activity. |

## Request example

```bash
curl -X POST \
  'https://work.ieltsbuddy.igopx.cn/api/v1/agent/capabilities/ielts_review_read_snapshot' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer $IELTS_BUDDY_TOKEN' \
  --data '{"includeMaterial":false,"limit":6,"maxMaterialChars":12000,"offset":0,"scope":"incorrect","target":"<target>"}'
```

## Request schema

```json
{
  "type": "object",
  "properties": {
    "includeMaterial": {
      "default": false,
      "description": "Include a bounded snapshot of the completed part's original material when local evidence analysis needs it.",
      "type": "boolean"
    },
    "limit": {
      "default": 6,
      "description": "Maximum review items returned in this page.",
      "type": "integer",
      "minimum": 1,
      "maximum": 6
    },
    "maxMaterialChars": {
      "default": 12000,
      "description": "Maximum combined characters returned for original material.",
      "type": "integer",
      "minimum": 1000,
      "maximum": 30000
    },
    "offset": {
      "default": 0,
      "description": "Pagination offset returned by the preceding review call.",
      "type": "integer",
      "minimum": 0,
      "maximum": 1000
    },
    "scope": {
      "default": "incorrect",
      "description": "Return incorrect objective items, or every available submitted response.",
      "type": "string",
      "enum": [
        "incorrect",
        "all"
      ]
    },
    "target": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "practice"
            },
            "sessionId": {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "kind",
            "sessionId"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "mock_section"
            },
            "sessionId": {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            "subject": {
              "type": "string",
              "enum": [
                "listening",
                "reading",
                "speaking",
                "writing"
              ]
            }
          },
          "required": [
            "kind",
            "sessionId",
            "subject"
          ],
          "additionalProperties": false
        }
      ],
      "description": "Exact review target returned by review.recent_activity."
    }
  },
  "required": [
    "includeMaterial",
    "limit",
    "maxMaterialChars",
    "offset",
    "scope",
    "target"
  ],
  "additionalProperties": false
}
```

## Response envelope

```json
{
  "code": 0,
  "data": {},
  "message": "ok"
}
```

## Errors

| HTTP | Code | Meaning |
| --- | --- | --- |
| 400 | `40001` | 请求参数不符合接口契约 |
| 401 | `40101` | 缺少或使用了无效的访问令牌 |
| 403 | `40301` | 访问令牌不包含接口所需权限 |
| 404 | `40401` | 接口或目标资源不存在 |
