# Get a TikTok Ad's analysis

> For the complete documentation index, see [llms.txt](https://www.shortsintel.com/llms.txt). Every docs page is also available as markdown: add .md to its URL. To connect, read [agents.md](https://www.shortsintel.com/agents.md).

GET `/v1/ads/tiktok/{ad_id}/intelligence`

The Ad's latest stored analysis, as an earlier `analyze` or a Tracker with `intelligence` computed it. Nothing is computed here: an Ad with none yet is `not_found`; ask for it with `analyze`. Shared across Customers.

[Open in Playground](https://www.shortsintel.com/console/playground?op=getTikTokAdIntelligence&ad_id=ad_id_example) (no API Key needed)

## Price

Free.

## Parameters

| Name | In | Type | Required | Default | Description |
| --- | --- | --- | --- | --- | --- |
| `ad_id` | path | `string` | Required | — | The TikTok ad library id. |

## Responses

### 200 OK

`{ library_id, intelligence }`.

object

- `library_id` string required
- `intelligence` any of 2 shapes required Ad analysis, versioned and computed once per Ad and version. `pipeline` says which set it is.
  - Option 1 object Video Ads: the full video analysis, read from the archived video with the ad copy as context, plus `offer`, `copy`, and detected shots, the product's first appearance and the opening frame under `structure`.
    - `version` integer required
    - `model` string required
    - `computed_at` string required
    - `source` string required
    - `content` object required
      - `summary` string required
      - `niche` string required
      - `languages` array of string required
      - `content_styles` array of string required
      - `keywords` array of object required
        - `keyword` string required
        - `category` string required
        - `sentiment` number required
      - `transcript` string required nullable What is said, one line per line: the Platform's captions or speech-to-text, never the scene breakdown. Empty with no speech; null when it could not be read.
      - `transcript_source` string required nullable one of `caption`, `whisper` `caption`: the Platform's caption track. `whisper`: speech-to-text on the audio. Null when `transcript` is null, and on analysis stored before 2026-11-09.
      - `transcript_segments` array of object required nullable Timed transcript lines (ms from the start), to see when the hook lands. From the Platform's timed captions when it has them, otherwise measured from the video's audio with speech-to-text. Spoken timing here is measured; times in `structure.scenes` are approximate. Empty when the video has no speech, music-only videos included. Null when the timing could not be measured, on a YouTube Video with no captions, and on older analyses.
        - `start_ms` integer required
        - `end_ms` integer required
        - `text` string required
    - `hook` object required
      - `opening_line` string required nullable
      - `type` string required
      - `visual_hook` string required nullable
      - `rationale` string required nullable
    - `persuasion` object required
      - `call_to_action` object required
        - `type` string required
        - `text` string required nullable
      - `sponsored` boolean required Whether the video is plausibly a paid promotion. Always true when the Platform labels it an ad or a paid partnership.
      - `sponsorship_signals` array of string required
      - `brands_and_products` array of object required
        - `name` string required
        - `kind` string required
        - `prominence` string required
      - `trend_references` array of object required
        - `name` string required
        - `kind` string required
    - `tone` object required
      - `sentiment_label` string required
      - `sentiment_score` number required
      - `primary_emotion` string required
      - `emotion_intensity` number required nullable
      - `emotion_rationale` string required nullable
      - `speaking_style` string required
      - `speaking_style_notes` string required nullable
    - `visual` object required
      - `format` string required
      - `setting` string required
      - `face_visibility` string required
      - `on_screen_text` array of string required
      - `has_on_screen_captions` boolean required
      - `camera_notes` string required nullable
      - `lighting_notes` string required nullable
      - `elements` any
    - `safety` object required
      - `brand_safety_tier` string required
      - `reasons` array of string required
      - `notes` string required nullable
    - `structure` object required When things happen inside the creative: the timed scenes every analysis carries, plus the shots detected, when the product is first seen and the opening frame on a video Ad.
      - `scenes` array of object required The timed scenes, read from the stored scene breakdown. Times are approximate, to about a second. Empty when the breakdown has no timed scenes, as on a photo carousel.
        - `start_ms` integer required Approximate scene start, ms from the start.
        - `end_ms` integer required Approximate scene end, ms from the start.
        - `visual` string required nullable
        - `text_overlay` string required nullable Text shown in this scene, listed at its first appearance: text repeated from an earlier scene is left out.
        - `speech` string required nullable
        - `audio` string required nullable Notable sound effects or music.
      - `shots` array of object required nullable The detected shots in order, each from one cut to the next. A cut is a frame whose ffmpeg scene score is over 0.2. On 29 labelled Ads this found 86% of hard cuts within 500 ms (median error 67 ms) and 61% of jump cuts overall, but none on UGC Ads. Null when detection failed, and on analysis stored before shots.
        - `start_ms` integer required Shot start: the cut before it, or 0.
        - `end_ms` integer required Shot end: the next cut, or the video's end.
      - `cuts_per_minute` number required nullable Detected cuts per minute of video, to two decimals. Null whenever `shots` is.
      - `avg_shot_ms` integer required nullable The video's length over its number of shots, in ms. Null whenever `shots` is.
      - `product_first_seen_ms` integer required nullable When the promoted product first appears (the item, its packaging or logo, or an app's screen), as the start of that scene in ms, so approximate to one scene. On 26 labelled Ads that show one, it was within 3 s of the labelled time on 23 (88%). Null when no product is shown, and on analysis stored before it.
      - `first_frame` string required nullable What the video's opening frame shows, as text: a description, not a time. Read from the first scene's `**Opening Frame:**` line in the scene breakdown. Checked against the video on 10 Ads, it was accurate on all 10. Null when the breakdown has no opening frame, and on analysis stored before it.
    - `pipeline` string required always `video`
    - `offer` object required nullable The offer, in the same types as an image Ad's `offer`. Null when the extraction failed and on analysis stored before this field.
      - `type` string required
      - `text` string required nullable
    - `copy` object required nullable The persuasion angle, in the same values as an image Ad's `copy.angle`. Null when the extraction failed and on analysis stored before this field.
      - `angle` string required
      - `rationale` string required nullable
  - Option 2 object Image and carousel Ads: the analysis an image can carry, read from the archived images with the ad copy as context.
    - `pipeline` string required always `image`
    - `version` integer required
    - `model` string required
    - `computed_at` string required
    - `images_analyzed` integer required
    - `summary` string required
    - `copy` object required
      - `angle` string required
      - `rationale` string required nullable
      - `headline` string required nullable
    - `offer` object required
      - `type` string required
      - `text` string required nullable
    - `call_to_action` object required
      - `type` string required
      - `text` string required nullable
    - `visual` object required
      - `format` string required
      - `on_image_text` array of string required
    - `topics` array of string required
    - `tone` object required
      - `sentiment_label` string required
      - `sentiment_score` number required

### 401 Unauthorized

Codes: `missing_authorization`, `invalid_key`, `key_revoked`, `key_expired`, `invalid_token`. The problem body and every code are on [Errors](https://www.shortsintel.com/docs/reference/errors).

### 404 Not Found

Code: `not_found`. The problem body and every code are on [Errors](https://www.shortsintel.com/docs/reference/errors).

## Related guides

- [Ads](https://www.shortsintel.com/docs/concepts/ads): Search Meta's, TikTok's and Google's ad libraries: the filters, what each Ad carries, the winner Score, Ad analysis, what is stored, and what a search costs.

## Request samples

curl:

```bash
curl "https://www.shortsintel.com/v1/ads/tiktok/ad_id_example/intelligence" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
```

TypeScript:

```typescript
const response = await fetch(
  "https://www.shortsintel.com/v1/ads/tiktok/ad_id_example/intelligence",
  {
    method: "GET",
    headers: {
      "Authorization": "Bearer sk_live_YOUR_KEY",
    },
  },
);

if (!response.ok) {
  throw new Error(`ShortsIntel ${response.status}`);
}

const data = await response.json();
```

Python:

```python
import requests

response = requests.get(
    "https://www.shortsintel.com/v1/ads/tiktok/ad_id_example/intelligence",
    headers={
        "Authorization": "Bearer sk_live_YOUR_KEY",
    },
)
response.raise_for_status()

data = response.json()
```

200 · `{ library_id, intelligence }`.

```json
{
  "library_id": "2233445566778899",
  "intelligence": {
    "pipeline": "image",
    "version": 1,
    "model": "gemini-3.5-flash-lite",
    "computed_at": "2026-09-21T10:02:11.000Z",
    "images_analyzed": 1,
    "summary": "A matte black cold plunge tub shot in a bright bathroom, sold on a daily three-minute routine.",
    "copy": {
      "angle": "TRANSFORMATION",
      "rationale": "The headline frames the tub as a daily ritual and the copy as an upgrade.",
      "headline": "Three minutes. Every morning."
    },
    "offer": {
      "type": "NONE",
      "text": null
    },
    "call_to_action": {
      "type": "VISIT_SITE",
      "text": "Learn More"
    },
    "visual": {
      "format": "PRODUCT_SHOT",
      "on_image_text": [
        "Three minutes. Every morning."
      ]
    },
    "topics": [
      "cold plunge",
      "morning routine",
      "home wellness"
    ],
    "tone": {
      "sentiment_label": "POSITIVE",
      "sentiment_score": 0.6
    }
  }
}
```

[Previous Get a Meta Ad's analysis](https://www.shortsintel.com/docs/reference/ads/get-meta-ad-intelligence)[Next Read a Meta Ad's history](https://www.shortsintel.com/docs/reference/ads/list-meta-ad-snapshots)
