Skip to content

Concepts

Scores

Outlier and velocity, how a creator baseline is built, what confidence means, and when a score stops being reported.

A view count on its own says nothing. Two hundred thousand views is a catastrophe for one creator and the best week of the year for another, so every score here is relative: how this video did against the person who posted it, and how fast it is still moving. Numbers only — there are no labels, no grades and no “viral” flag, because where the line sits is your decision and not ours.

The two numbers

Outlier is a multiple of the creator’s median views. Above 1 means this video beat their usual; below means it did not. It is a ratio, so it is comparable across creators of wildly different sizes in a way raw views never are.

Velocity is views per hour since the video was posted. Outlier tells you where a video ended up; velocity tells you whether it is still going. A video with a modest outlier and a high velocity is worth watching; the same outlier with velocity near zero is finished.

POST /v1/videos/{platform}/{id}/score·$0.05, never cached — asking for a score is asking for the fetch.

curl -X POST "https://www.shortsintel.com/v1/videos/tiktok/7300000000000000000/score?wait=30" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

200 · The Run finished inside the wait budget: `{ run, result }`. With `estimate=true`, `{ estimate_usd, cached }` instead.

{
  "run": {
    "id": "run_8f2c1ad04b",
    "kind": "video_score",
    "status": "completed",
    "created_at": "2026-09-08T09:14:02.418Z",
    "completed_at": "2026-09-08T09:14:04.930Z",
    "charge_usd": 0.05,
    "list_price_usd": 0.05,
    "cached": false
  },
  "result": {
    "video": {
      "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
        }
      }
    },
    "creator": {
      "platform": "tiktok",
      "id": "cre_9d4b2a7f1c",
      "handle": "someone",
      "name": "Someone",
      "avatar_url": "https://p16-sign.tiktokcdn.com/obj/tos-avatar-someone.jpeg",
      "follower_count": 184300,
      "bio": "Cold water, early mornings, and the numbers behind both.",
      "snapshot": {
        "at": "2026-09-08T09:14:04.219Z",
        "followers": 184300
      },
      "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
      }
    }
  }
}

POST /v1/videos/{platform}/{id}/score · $0.05, never cached — asking for a score is asking for the fetch.

Every field

outlier
Views divided by the creator's median views. 1 is a typical video for them; 3.4 is a video that did three and a half times their usual.
outlier_p90
The same multiple against the creator's 90th-percentile video, so a hit can be told from a hit-among-their-hits.
percentile
Where this video sits inside the creator's own sample, 0 to 100.
velocity
Views per hour since posting, with the window the figure was measured over.
reason
Why a number is missing when it is. Today the only value is `aged_out`.
baseline
The yardstick every number above was measured against, quoted in full so a score can be recomputed or argued with.

The baseline

The baseline is the creator’s own yardstick, and the precision matters: an outlier of 3.4 only means something if everyone computing it excluded the same videos. It is built from that creator’s last 20 videos by posted time, with two exclusions.

  • Videos under 48 hours old are left out. Their view count is still climbing steeply, and including one drags the median down and makes everything older look like an outlier.
  • The video being scored is left out. A video cannot be part of the yardstick it is measured against, or one giant post would inflate the median it is then compared to.
median_views
Median views across the sample. The denominator of `outlier`.
p90_views
The sample's 90th percentile. The denominator of `outlier_p90`.
engagement_rate
Mean of likes, comments, shares and saves over views across the sample.
posts_per_week
How often this creator posts, over the same window.
sample
How many videos went into the baseline.
confidence
`high` once the sample is big enough, `low` otherwise.
source
`videos` when the figures came from this creator's own posts, `follower_tier` when there were too few to measure and a benchmark stood in.
computed_at
When the baseline was last computed.
stale
True past 7 days; the next lookup recomputes it.

The baseline comes back in full on every scored response, so you can recompute any number we report, or apply your own threshold to the same sample.

Confidence and the fallback

confidence is high once the baseline has at least 5 usable videos behind it. Under that, a median is not measuring anything, so we fall back to a benchmark for the creator’s follower size, mark the baseline low and set source to say the figures were estimated rather than observed.

A low-confidence score is still a number and still useful, but it is a guess about a stranger: treat it as a signal to look, not as evidence. Check source before you let a score make a decision on its own.

A baseline goes stale after 7 days and is recomputed by the next lookup, so a creator you touch regularly is always measured against their recent form rather than last quarter’s.

When a score ages out

Past 30 days we stop reporting a score. The fields come back null with reason saying aged_out — not an error, and not zero: an explicit “this is no longer a meaningful measurement”. Velocity on a year-old video is an average over a year of nothing happening, and an outlier against a baseline the creator has long since outgrown compares two different people.

Branch on reason rather than on a missing field, and score videos while they are young.

Where scores turn up

GET /v1/videos/{platform}/{id} carries scores whenever the creator already has a baseline, and null when they do not — a lookup will not go and fetch a creator’s history on its own. Asking for the score explicitly is what forces that fetch, which is why it costs $0.05 and is never discounted: asking for a score is asking for the work.

Search results are never scored, for the same reason. If you want a page of hits ranked by outlier, score the ones you care about afterwards. See the reference for which operations carry which.