YouTube Analytics creatorContentType: split Shorts from long-form
The creatorContentType dimension separates SHORTS from VIDEO_ON_DEMAND in YouTube Analytics API reports. How to use it on clips you generated with Sume.

To measure Shorts apart from long-form videos in the YouTube Analytics API, add the creatorContentType dimension to a report. It labels each row with the kind of content that was viewed: SHORTS for a Short, VIDEO_ON_DEMAND for a regular video, and three other values for livestreams, Stories and unknowns. Data for the dimension starts on January 1, 2019.
That makes it the right tool when you generate Shorts in volume and want channel-level answers, such as how many views came from Shorts last month versus long-form. It is a different job from per-video counts, which the batchGetStats post covers. Sume generates and edits the clips; it does not call the Analytics API, so this part lives in your own script.
What values does creatorContentType return?
Google's dimensions reference defines the dimension as the type of content associated with the user activity metrics in the row, and lists five values.
| Value | Meaning on the page |
|---|---|
| SHORTS | The viewed content was a YouTube Short |
| VIDEO_ON_DEMAND | A YouTube video that does not fall under one of the other values |
| LIVE_STREAM | The viewed content was a YouTube livestream |
| STORY | The viewed content was a YouTube Story |
| UNSPECIFIED | The content type of the viewed content is unknown |
Which reports accept it?
The channel reports page lists creatorContentType as an optional dimension in several reports, including a user-activity-by-country report and a playback-details report. It also appears in playlist reports. The page does not give a sample request that uses it, so confirm the exact dimension and metric combination in the report tables before you rely on a query.
A query goes to GET https://youtubeanalytics.googleapis.com/v2/reports with ids, startDate, endDate and metrics; dimensions and filters are optional, per the reports.query reference. The yt-analytics.readonly scope covers viewing reports. The reference also notes that data for the most recent days can be missing from queries that use the day dimension, so do not read yesterday's Shorts total as final.
from urllib.parse import urlencode
params = {
"ids": "channel==MINE",
"startDate": "2026-09-01",
"endDate": "2026-09-30",
"metrics": "views",
"dimensions": "day,creatorContentType",
}
url = "https://youtubeanalytics.googleapis.com/v2/reports?" + urlencode(params)
print(url)
# Send it with: Authorization: Bearer <token with yt-analytics.readonly>
# Confirm this dimension/metric pair against the report tables first.Where does Sume fit in the measurement loop?
The label is YouTube's classification of what viewers watched, not a promise about what you intended. If a clip you meant as a Short is reported under another value, you need to know what file you actually shipped before you blame the creative. So keep your own record of what you produced.
Before upload, run the clip through video inspect. It returns a probe with duration_seconds, width, height and size_bytes and does not re-encode the source. Store those four numbers beside the video id you get back from YouTube. If a video later shows up under an unexpected content type, you can compare YouTube's label with the file you actually shipped. The preflight post has a Python version of that check.
Generated clips come from a video generation job whose result you download from unsigned_urls; the job id is a convenient key for that record.
What this does not tell you
creatorContentType splits activity by content type. It does not say why a Short underperformed, and it does not identify which Sume variant won an A/B test; for that you still need video-level rows. Since August 27, 2026 views count the moment a video begins to play across formats, which affects any before-and-after comparison; the view-count post covers it.
- Use creatorContentType for channel-level Shorts versus long-form totals.
- Use per-video stats for single-clip performance.
- Keep a Sume job id to YouTube video id table so either view can be traced to the file.
Sources
Related posts
More in Developers
- YouTube captions.update costs 450 units: replace a caption track
captions.list costs 50, captions.update 450, captions.insert 400. Plan how many Sume-made caption files a 10,000-unit day can replace on your Shorts.
- YouTube Data API changes in 2026: a checklist for Shorts uploads
The 2026 YouTube Data API changes that touch Shorts uploads: own quota bucket, batchGetStats, 50 MB thumbnails, new view rule, and what to change.
- defaultLanguage vs defaultAudioLanguage on a dubbed AI Short
snippet.defaultLanguage is the language of title and description; defaultAudioLanguage is the spoken language. Set each on a dubbed or voiced Short.
- YouTube description limit is 5000 bytes, not characters: check it
The Data API caps snippet.description at 5000 bytes and snippet.title at 100 characters. A Python check for both, and where a Sume transcript fits.
Written by Sume