Skip to main content

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

An asset begins as a file in blob storage, becomes part of a submission, is processed by analysis workflows, and ends in either complete or failed.

Supported formats

TypeMIME typesMax size
Videovideo/mp4, video/quicktime, video/x-msvideo, video/x-matroska5 GB
Audioaudio/mpeg, audio/wav, audio/x-wav, audio/aac, audio/ogg500 MB
Imageimage/jpeg, image/png, image/gif, image/webp, image/svg+xml50 MB
Documentapplication/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, text/plain100 MB
The 10 MB direct-upload cap is only a streaming limit on POST /api/integrations/uploads/direct. Larger files (up to the per-category maximums above) use a presigned URL. See Uploads.

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/integrations/submissions/{submission_id}/assets/{asset_id}
{
  "assetId": "a1...",
  "submissionId": "s1...",
  "filename": "campaign-video.mp4",
  "mimeType": "video/mp4",
  "status": "complete",
  "issueCount": 2,
  "versionNumber": 1,
  "versionGroupId": "g1...",
  "issues": [ ]
}
The issues array contains IssueResponse objects.

Issues

Each issue describes a compliance or quality concern found during analysis:
{
  "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/integrations/submissions/{submission_id}/assets/{asset_id}/issues
{
  "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/integrations/submissions/{submission_id}/assets/{asset_id}/topics
{
  "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.
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.

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/integrations/submissions/{submission_id}/versions
{
  "versions": [
    {
      "assetId": "a1...",
      "submissionId": "s1...",
      "versionNumber": 1,
      "name": "campaign-video.mp4",
      "createdAt": "2026-06-03T12:00:00Z",
      "status": "complete",
      "issueCount": 3
    }
  ],
  "total": 1
}