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

# Get Analysis

> Retrieve AI analysis results for a video

Returns the AI-powered analysis for a specific video, including transcript, hook analysis, virality signals, CTA detection, monetization insights, and more.

The response depends on the analysis status:

* **`null`** — No analysis exists yet. Show an "Analyze" button.
* **`pending` / `downloading`** — Analysis is queued or downloading video.
* **`transcribed`** — Whisper transcription complete. Transcript and segments are available, but visual analysis is still running.
* **`analyzing`** — Visual analysis in progress.
* **`completed`** — Full analysis available with all fields populated.
* **`failed`** — Analysis failed. Check the `error` field. User can retry.

## Path parameters

<ParamField path="videoId" type="string" required>
  The video UUID.
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -H "Authorization: Bearer reel25_sk_..." \
    https://api.reel25.com/api/v1/video-analysis/550e8400-e29b-41d4-a716-446655440000
  ```

  ```javascript Node.js theme={null}
  const response = await fetch(
    'https://api.reel25.com/api/v1/video-analysis/550e8400-e29b-41d4-a716-446655440000',
    { headers: { 'Authorization': 'Bearer reel25_sk_...' } }
  );
  const { data } = await response.json();
  ```

  ```python Python theme={null}
  import requests

  video_id = '550e8400-e29b-41d4-a716-446655440000'
  response = requests.get(
      f'https://api.reel25.com/api/v1/video-analysis/{video_id}',
      headers={'Authorization': 'Bearer reel25_sk_...'}
  )
  ```
</RequestExample>

<ResponseExample>
  ```json 200 — completed theme={null}
  {
    "data": {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "videoId": "550e8400-e29b-41d4-a716-446655440000",
      "status": "completed",
      "transcript": "Stop doing time zone math in your head. Meet HoverTime...",
      "transcriptSegments": [
        { "start": 0.0, "end": 2.1, "text": "Stop doing time zone math in your head." },
        { "start": 2.1, "end": 5.3, "text": "Meet HoverTime: The easiest way to convert time zones instantly." },
        { "start": 5.3, "end": 8.0, "text": "Just hover over a time in your email or Slack, and boom it's in your local time." }
      ],
      "transcriptDuration": "15s",
      "transcriptLanguage": "en",
      "summary": "Product demo showcasing HoverTime, a browser extension that converts time zones on hover.",
      "category": "Software Apps",
      "matchedTopics": ["time zones", "productivity", "browser extension"],
      "format": "Product Demo Review",
      "hookStyle": "Pain Point Callout",
      "hookPhrase": "Stop doing time zone math in your head",
      "visualHook": "Text appearing on white background with timezone abbreviations",
      "textHook": "EST PST HoverTime",
      "audioHook": "Stop doing time zone math in your head",
      "hookStartsAt": "0.0",
      "structure": [
        { "start": 0.0, "end": 2.0, "type": "Hook", "description": "Pain point callout about timezone math." },
        { "start": 2.0, "end": 8.0, "type": "Demo", "description": "Screen recording showing HoverTime in Gmail and Slack." },
        { "start": 8.0, "end": 12.0, "type": "Solution", "description": "Highlights no tabs, no Google, no math." },
        { "start": 12.0, "end": 15.0, "type": "CTA", "description": "Direct URL call-to-action." }
      ],
      "primaryTrigger": "Relief & Simplicity",
      "retentionPattern": "Step Sequence",
      "shareDriver": "Utility for Others",
      "saveDriver": "Tool Reference",
      "hasCta": true,
      "ctaType": "Direct URL",
      "ctaText": "Get HoverTime now: seconds.ae/hovertime",
      "ctaShownAt": "14.0",
      "ctaDestinationUrl": "https://seconds.ae/hovertime",
      "productType": "SaaS",
      "brandFirstShownAt": "14.0",
      "brandsMentioned": [
        { "name": "Seconds", "url": "https://seconds.ae" }
      ],
      "productsMentioned": [
        { "name": "HoverTime", "type": "SaaS", "url": "https://seconds.ae/hovertime", "appStoreUrl": null }
      ],
      "ugcFit": "Strong UGC fit",
      "ugcConfidence": 95,
      "ugcReason": "Clean screen recording format makes it easy to replicate for any SaaS product.",
      "onScreenSetup": "No People",
      "genderPresentation": "Not Applicable",
      "ageRange": "Not Applicable",
      "editingStyle": "Screen Recording",
      "recordingType": "Screencast",
      "hasSubtitles": false,
      "hasTextOverlays": true,
      "musicType": "Original Sound",
      "hasVoiceover": true,
      "hasBackgroundMusic": false,
      "modelUsed": "whisper-1 + qwen/qwen3.5-flash-02-23",
      "tokensIn": 14113,
      "tokensOut": 3338,
      "costUsd": "0.018423",
      "processingTimeMs": 25045,
      "error": null,
      "createdAt": "2026-03-22T08:00:00.000Z",
      "updatedAt": "2026-03-22T08:00:25.000Z"
    }
  }
  ```

  ```json 200 — transcribed (partial) theme={null}
  {
    "data": {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "videoId": "550e8400-e29b-41d4-a716-446655440000",
      "status": "transcribed",
      "transcript": "Stop doing time zone math in your head...",
      "transcriptSegments": [
        { "start": 0.0, "end": 2.1, "text": "Stop doing time zone math in your head." }
      ],
      "transcriptDuration": "15s",
      "transcriptLanguage": "en",
      "summary": null,
      "category": null,
      "format": null,
      "hookStyle": null
    }
  }
  ```

  ```json 200 — no analysis theme={null}
  {
    "data": null
  }
  ```

  ```json 200 — failed theme={null}
  {
    "data": {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "videoId": "550e8400-e29b-41d4-a716-446655440000",
      "status": "failed",
      "error": "Qwen: Empty response from OpenRouter",
      "transcript": "Stop doing time zone math...",
      "transcriptDuration": "15s"
    }
  }
  ```
</ResponseExample>

## Response fields

### Status & Transcript

| Field | Type | Description |
| - | - | - |
| `status` | string | `pending` \| `downloading` \| `transcribed` \| `analyzing` \| `completed` \| `failed` |
| `transcript` | string \| null | Full Whisper transcription text |
| `transcriptSegments` | array \| null | Timestamped segments: `[{start, end, text}]` |
| `transcriptDuration` | string \| null | Video duration, e.g. `"45s"` |
| `transcriptLanguage` | string \| null | ISO language code, e.g. `"en"`, `"ru"` |

### Classification

| Field | Type | Description |
| - | - | - |
| `summary` | string \| null | 1-2 sentence summary of the video |
| `category` | string \| null | Vertical category (e.g. `"Software Apps"`, `"Beauty Fashion"`) |
| `matchedTopics` | string\[] \| null | 2-5 topic tags for search/filtering |
| `format` | string \| null | Video format (e.g. `"Product Demo Review"`, `"Talking Head"`) |

### Hook Analysis

| Field | Type | Description |
| - | - | - |
| `hookStyle` | string \| null | Hook type (e.g. `"Pain Point Callout"`, `"Curiosity Gap"`) |
| `hookPhrase` | string \| null | Exact spoken/displayed hook phrase |
| `visualHook` | string \| null | Description of the visual hook element |
| `textHook` | string \| null | On-screen text overlay in first 3 seconds |
| `audioHook` | string \| null | First spoken words |
| `hookStartsAt` | string \| null | Timestamp in seconds (e.g. `"0.0"`) |

### Video Structure

| Field | Type | Description |
| - | - | - |
| `structure` | array \| null | 2-6 segments: `[{start, end, type, description}]`. Types: `Hook`, `Demo`, `Story`, `CTA`, `Problem`, `Solution`, `Transition`, `Punchline`, `B-Roll`, `Intro`, `Outro`, `Testimonial` |

### Virality Signals

| Field | Type | Description |
| - | - | - |
| `primaryTrigger` | string \| null | e.g. `"Aspiration"`, `"Humor & Relatability"` |
| `retentionPattern` | string \| null | e.g. `"Step Sequence"`, `"Story Arc"`, `"Loop Seamless"` |
| `shareDriver` | string \| null | e.g. `"Utility for Others"`, `"Identity Signaling"` |
| `saveDriver` | string \| null | e.g. `"Tutorial Reference"`, `"Shopping List"` |

### CTA

| Field | Type | Description |
| - | - | - |
| `hasCta` | boolean \| null | Whether a CTA was detected |
| `ctaType` | string \| null | `"Link in Bio"`, `"Direct URL"`, `"Comment Keyword"`, `"None"`, etc. |
| `ctaText` | string \| null | Exact CTA text or spoken phrase |
| `ctaShownAt` | string \| null | Timestamp in seconds |
| `ctaDestinationUrl` | string \| null | URL mentioned or shown on screen |

### Monetization

| Field | Type | Description |
| - | - | - |
| `productType` | string \| null | `"SaaS"`, `"Ecommerce Physical"`, `"Course Coaching"`, etc. |
| `brandFirstShownAt` | string \| null | Timestamp in seconds |
| `brandsMentioned` | array \| null | `[{name, url}]` |
| `productsMentioned` | array \| null | `[{name, type, url, appStoreUrl}]` |

### UGC Assessment

| Field | Type | Description |
| - | - | - |
| `ugcFit` | string \| null | `"No UGC fit"`, `"Weak UGC fit"`, `"Moderate UGC fit"`, `"Strong UGC fit"` |
| `ugcConfidence` | integer \| null | 0-100 confidence score |
| `ugcReason` | string \| null | Explanation of the UGC assessment |

### Creator Profile

| Field | Type | Description |
| - | - | - |
| `onScreenSetup` | string \| null | `"Solo"`, `"Duo"`, `"Group"`, `"No People"`, `"Voiceover Only"` |
| `genderPresentation` | string \| null | `"Male Presentation"`, `"Female Presentation"`, `"Mixed"`, `"Not Applicable"` |
| `ageRange` | string \| null | `"Child"`, `"Teen"`, `"Young Adult"`, `"Adult"`, `"Middle-Aged"`, `"Senior"`, `"Not Applicable"` |

### Visual & Audio

| Field | Type | Description |
| - | - | - |
| `editingStyle` | string \| null | `"Jump Cut"`, `"Screen Recording"`, `"Raw Unedited"`, etc. |
| `recordingType` | string \| null | `"Camera"`, `"Screencast"`, `"Mixed"`, `"AI Generated"`, etc. |
| `hasSubtitles` | boolean \| null | Whether subtitles are present |
| `hasTextOverlays` | boolean \| null | Whether text overlays are used |
| `musicType` | string \| null | `"Original Sound"`, `"Trending Audio"`, `"Voiceover Only"`, etc. |
| `hasVoiceover` | boolean \| null | Whether voiceover is present |
| `hasBackgroundMusic` | boolean \| null | Whether background music is present |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.