> ## Documentation Index
> Fetch the complete documentation index at: https://docs.iclear.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Assets

> Learn about media assets and processing results

## What is an asset?

An asset is a single media file (video, audio, image, or document) that you submit for processing. Each asset within a submission is processed independently and generates its own results.

## Asset lifecycle

```mermaid theme={null}
graph TD
  A[Uploaded to blob storage] --> B[queued]
  B --> C[processing]
  C --> D[compliant]
  C --> E[in_review]
  C --> F[failed]
```

An asset begins as a file in blob storage, becomes part of a submission, waits in a `queued` state for a free review slot, is analyzed, and ends in one of three terminal states: `compliant` (no issues found), `in_review` (issues found and awaiting your review), or `failed`. The `queued` state is non-terminal — an asset stays queued only until capacity frees up, then moves to `processing`.

These are the values of **`processingStatus`**, which you read from `assets[]` on the submission status response:

| `processingStatus` | Meaning                                                 |
| ------------------ | ------------------------------------------------------- |
| `queued`           | Accepted, waiting for a free review slot                |
| `processing`       | Actively being analyzed                                 |
| `compliant`        | Finished — no issues found                              |
| `in_review`        | Finished — issues found, awaiting your review           |
| `failed`           | Analysis failed; check `errorMessage` and `isRetryable` |
| `archived`         | Terminal, set after review is committed                 |

## Supported formats

| Type     | MIME types                                                                                                                       | Max size |
| -------- | -------------------------------------------------------------------------------------------------------------------------------- | -------- |
| Video    | `video/mp4`, `video/quicktime`, `video/x-msvideo`, `video/x-matroska`                                                            | 5 GB     |
| Audio    | `audio/mpeg`, `audio/wav`, `audio/x-wav`, `audio/aac`, `audio/ogg`                                                               | 500 MB   |
| Image    | `image/jpeg`, `image/png`, `image/gif`, `image/webp`, `image/svg+xml`                                                            | 50 MB    |
| Document | `application/pdf`, `application/msword`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `text/plain` | 100 MB   |

<Tip>
  Files up to the per-category maximums above are uploaded with a presigned URL. See [Uploads](/concepts/uploads).
</Tip>

## Asset results

Once an asset finishes processing, you can retrieve its detailed result. There is no `/results` suffix — the asset detail is the asset endpoint itself.

GET `/api/submissions/{submission_id}/assets/{asset_id}`

```json theme={null}
{
  "assetId": "a1...",
  "submissionId": "s1...",
  "filename": "campaign-video.mp4",
  "mimeType": "video/mp4",
  "status": "complete",
  "issueCount": 2,
  "versionNumber": 1,
  "versionGroupId": "g1...",
  "startedAt": "2026-06-03T12:00:05Z",
  "completedAt": "2026-06-03T12:04:12Z",
  "issues": [ ]
}
```

The `issues` array contains `IssueResponse` objects. `startedAt` and `completedAt` are when this asset actually entered and left review — `null` while it is still queued, and re-stamped by a retry. `completedAt` is set for any terminal outcome, so on a failed asset it is the failure time.

### Issues

Each issue describes a compliance or quality concern found during analysis:

```json theme={null}
{
  "id": "i1...",
  "referenceNumber": 1,
  "ruleCode": "CAP_8.4",
  "summary": "Unsubstantiated pricing claim",
  "severity": "MAJOR",
  "status": "OPEN",
  "sidekickId": "sk1...",
  "createdAt": "2026-06-03T12:05:00Z",
  "updatedAt": "2026-06-03T12:05:00Z",
  "severityReasoning": "…",
  "severityReasoningHeadline": "…",
  "precedents": [
    { "url": "...", "title": "...", "decision": "Upheld", "date": "2024-01-01" }
  ]
}
```

Severity levels:

* `CRITICAL`
* `MAJOR`
* `MINOR`
* `INFO`

Issue statuses:

* `OPEN`
* `ACKNOWLEDGED`
* `AWAITING_HUMAN_INPUT`
* `RESOLVED`
* `DISMISSED`

### Enriched issues

For a flat list of issues enriched with their rule-graph context, call:

GET `/api/submissions/{submission_id}/assets/{asset_id}/issues`

```json theme={null}
{
  "assetId": "a1...",
  "issues": [ ],
  "total": 3
}
```

Each enriched issue carries the underlying rule-graph constructs that produced it, including **contributors** and **evidence**. These are not "people mentioned in the media" — they are nodes in the rule graph (contributing factors) and the supporting evidence the analysis attached to each, used to explain why the issue fired.

### Topics

To group related issues, the API clusters them into topics using AI:

GET `/api/submissions/{submission_id}/assets/{asset_id}/topics`

```json theme={null}
{
  "assetId": "a1...",
  "topics": [ ],
  "orphanIssues": [ ],
  "metadata": { "totalTopics": 2, "orphanIssueCount": 1 }
}
```

A topic groups two or more related issues. Issues that do not cluster appear in `orphanIssues` — this is normal, not an error.

<Note>
  The `/issues` and `/topics` endpoints return `404` if the asset has not finished processing yet, and `502` if the underlying analysis blob fails to load from storage.
</Note>

## Versioning

To create a new version of an asset, submit a new submission whose asset references the original through `previousSubmissionId`. This is useful when:

* The original file was incomplete or had audio issues
* You want a fresh analysis with newer processing models
* Processing previously failed and you want to retry against a corrected file

Each version increments `versionNumber` within a shared `versionGroupId`. Previous versions remain accessible. List all versions of a submission's assets with:

GET `/api/submissions/{submission_id}/versions`

```json theme={null}
{
  "versions": [
    {
      "assetId": "a1...",
      "submissionId": "s1...",
      "versionNumber": 1,
      "name": "campaign-video.mp4",
      "createdAt": "2026-06-03T12:00:00Z",
      "status": "complete",
      "issueCount": 3
    }
  ],
  "total": 1
}
```
