Concepts
Analysis
What we derive from a video, why it is computed once and reused, and when asking for a refresh is charged as new work.
Analysis is what we derive from a video by watching it: the hook, the claim, the call to action, the transcript, and everything else a model can read off the media that the platform’s own metadata does not tell you. It is computed once per video, kept, and handed back to everyone who asks afterwards at a quarter of the price.
Asking for it
One operation does the work, and it takes the same video address as every other video call.
POST /v1/videos/{platform}/{id}/intelligence·$0.02 fresh, $0.005 cached. `refresh: true` is always charged as fresh — it is a request to redo the work.
curl -X POST "https://www.shortsintel.com/v1/videos/tiktok/7300000000000000000/intelligence?wait=30" \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"refresh":true}'const response = await fetch(
"https://www.shortsintel.com/v1/videos/tiktok/7300000000000000000/intelligence?wait=30",
{
method: "POST",
headers: {
"Authorization": "Bearer sk_live_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"refresh": true
}),
},
);
if (!response.ok) {
throw new Error(`ShortsIntel ${response.status}`);
}
const data = await response.json();import requests
response = requests.post(
"https://www.shortsintel.com/v1/videos/tiktok/7300000000000000000/intelligence?wait=30",
headers={
"Authorization": "Bearer sk_live_YOUR_KEY",
"Content-Type": "application/json",
},
json={
"refresh": True,
},
)
response.raise_for_status()
data = response.json()200 · The Run finished inside the wait budget: `{ run, result }`. With `estimate=true`, `{ estimate_usd, cached }` instead.
{
"run": {
"id": "run_8f2c1ad04b",
"kind": "video_intelligence",
"status": "completed",
"created_at": "2026-09-08T09:14:02.418Z",
"completed_at": "2026-09-08T09:14:04.930Z",
"charge_usd": 0.02,
"list_price_usd": 0.02,
"cached": false
},
"result": {
"platform": "tiktok",
"id": "7300000000000000000",
"url": "https://www.tiktok.com/@someone/video/7300000000000000000",
"description": "3 minutes at 4°C every morning for 30 days. Here is what actually changed. #coldplunge #recovery",
"posted_at": "2026-09-05T06:32:11.000Z",
"duration_seconds": 41,
"thumbnail_url": "https://p16-sign.tiktokcdn.com/obj/tos-cover-7300000000000000000.jpeg",
"hashtags": [
"coldplunge",
"recovery",
"morningroutine"
],
"sound": {
"id": "7180000000000000000",
"title": "original sound - someone"
},
"creator": {
"id": "cre_9d4b2a7f1c",
"handle": "someone",
"name": "Someone",
"follower_count": 184300
},
"snapshot": {
"at": "2026-09-08T09:14:04.219Z",
"views": 1284000,
"likes": 143200,
"comments": 2810,
"shares": 9040,
"saves": 21600
},
"scores": {
"outlier": 4.21,
"outlier_p90": 1.6,
"percentile": 95,
"velocity": {
"views_per_hour": 6698.6,
"window": "snapshot"
},
"reason": null,
"baseline": {
"median_views": 305000,
"p90_views": 802000,
"engagement_rate": 0.1342,
"posts_per_week": 4.1,
"sample": 20,
"confidence": "high",
"source": "videos",
"computed_at": "2026-09-08T09:14:03.902Z",
"stale": false
}
},
"intelligence": {
"version": 1,
"model": "gemini-2.5-flash",
"computed_at": "2026-09-08T09:14:04.612Z",
"source": "speech",
"content": {
"summary": "A 30-day cold plunge diary that leads with the measurable change and keeps the discomfort visible rather than heroic.",
"niche": "HEALTH_AND_FITNESS",
"languages": [
"en"
],
"content_styles": [
"TALKING_HEAD",
"PROGRESS_DIARY"
],
"keywords": [
{
"keyword": "cold plunge",
"category": "ACTION",
"sentiment": 0.4
},
{
"keyword": "recovery",
"category": "TOPIC",
"sentiment": 0.6
}
],
"transcript": "Day one I lasted eleven seconds. Day thirty I stopped noticing the cold at all, and that is the part nobody warns you about..."
},
"hook": {
"opening_line": "Day one I lasted eleven seconds.",
"type": "SPECIFIC_DETAIL",
"visual_hook": "Timer overlay counting up on a shot of the plunge tub at dawn",
"rationale": "A concrete, unimpressive number invites the viewer to stay for the number it becomes."
},
"persuasion": {
"call_to_action": {
"type": "FOLLOW",
"text": "Following along? Day 60 starts Monday."
},
"sponsored": false,
"sponsorship_signals": [],
"brands_and_products": [
{
"name": "Plunge",
"kind": "PRODUCT",
"prominence": "INCIDENTAL"
}
],
"trend_references": [
{
"name": "30-day challenge",
"kind": "FORMAT"
}
]
},
"tone": {
"sentiment_label": "Positive",
"sentiment_score": 0.42,
"primary_emotion": "Determination",
"emotion_intensity": 0.6,
"emotion_rationale": "The delivery stays level through visible discomfort, which reads as resolve rather than excitement.",
"speaking_style": "CONVERSATIONAL",
"speaking_style_notes": "Unhurried voiceover over hard cuts between mornings, with no music bed under the first ten seconds."
},
"visual": {
"format": "VLOG",
"setting": "OUTDOOR_HOME",
"face_visibility": "CREATOR_ON_CAMERA",
"on_screen_text": [
"DAY 1",
"DAY 30",
"11s → 3:00"
],
"has_on_screen_captions": true,
"camera_notes": "Fixed tripod at tub height, one handheld reaction shot per morning, cut roughly every two seconds.",
"lighting_notes": "Natural dawn light, cool and slightly underexposed throughout.",
"elements": [
{
"type": "OBJECT",
"name": "ice bath",
"confidence": 0.97
}
]
},
"safety": {
"brand_safety_tier": "SAFE",
"reasons": [],
"notes": null
}
}
}
}The result is the video you would get from GET /v1/videos/{platform}/{id} with one extra object on it. That object carries its own provenance — version, model, computed_at and source — so you always know how old an analysis is and what produced it.
What is in it
- content
- What the video is about: a summary, its niche, the languages spoken, the styles it uses, weighted keywords and the transcript.
- hook
- The first few seconds: the opening line, what kind of hook it is, the visual that carries it, and why it works.
- persuasion
- What the video asks of the viewer: the call to action, whether it is sponsored, the brands and products in it, and the trends it leans on.
- tone
- How it is said — register, pacing and emotional register — rather than what is said.
- visual
- What is on screen: setting, shot types, text overlays, editing.
- safety
- Anything that would stop you reusing the idea: sensitive topics, claims that need substantiating, brand-safety flags.
Every field is a value, not a verdict: a hook type, a niche, a sentiment. Nothing here scores the video against its creator — that is what scores are for.
Computed once, reused
An analysis is stored against the video and the version of the pass that produced it. The first request for a video pays $0.02 and waits for the work; every later request at the same version is answered from store for $0.005 and comes back immediately.
A version bump changes that. When the pass itself changes, stored analyses at the old version stop being usable and the next request recomputes lazily, charged as fresh — you are paying for a different, better answer, not for the same one twice.
POST /v1/videos/{platform}/{id}/intelligence · $0.02 fresh, $0.005 cached. `refresh: true` is always charged as fresh — it is a request to redo the work.
Refreshing on purpose
Send { "refresh": true } and the pass runs again even though a current answer is stored. That is always charged as fresh, at $0.02, because it is a request to redo the work: the discount exists for reading what we already have, and a refresh is you asking us not to.
There is rarely a reason to. Analysis describes the video, and the video does not change — the stats around it do. Refresh when you have reason to think the first pass went wrong, not on a schedule.
Videos that cannot be analysed
A video with no speech in it still analyses. The pass reads the media, not a transcript: a silent piece to camera has a hook, a setting, text on screen and a call to action, and it comes back with source saying the analysis was not built from speech.
What does fail is media we cannot fetch — a deleted video, a private account, a platform refusing the download. That Run ends failed with media_unavailable, and a failed Run is charged nothing. Retrying it will keep failing until the media comes back, so treat that code as a fact about the video rather than a transient error.
The cheaper half
If all you want is the words, ask for the transcript on its own. It is flat-priced at $0.005 — the same as reading a stored analysis, because it runs the media pass alone and never the structured one — and it is not discounted on a second read, since it is already priced at what the cheap read costs.