Skip to main content
YouTube handles both traditional long-form videos and Shorts (vertical video). The API comes with legal requirements you can’t ignore.

Supported Content Types

  • Videos: Long-form content. 1 video, up to 4 hours. Max 5 GB.
  • Shorts: Vertical/square video, max 3 minutes. YouTube auto-detects based on duration and aspect ratio.

Quirks & Gotchas

”Made for Kids” (COPPA)

This is not just a quirk, it’s a legal requirement.
  • You must flag content as madeForKids: true if it targets children.
  • Failure to do so can result in penalties - real ones, from the FTC.
  • We expose this field in the data.YOUTUBE object. Use it. Don’t skip it. Don’t “figure it out later”.

Shorts Detection

There is no special “upload as Short” button. YouTube decides for you based on the file:
  • Duration: Under 3 minutes (180 seconds).
  • Aspect Ratio: Vertical (9:16) or Square (1:1). Technically 1:3 to 1:1.
If your video meets these criteria, it becomes a Short. If it doesn’t, it’s a regular video.

YouTube Title is Required

Unlike most platforms where you just need text, YouTube treats data.YOUTUBE.text as the video title. If you leave it empty, YouTube can reject the upload.

Media Limits

See Platform Limits for the full breakdown.

Text & Field Limits


Post Options

Send YouTube-specific options inside data.YOUTUBE.

Analytics

For general analytics concepts (refresh rates, data retention, what “Returns 0” means), see the Analytics Overview. YouTube analytics are all Lifetime values. There is no rolling window - everything is cumulative from day one.

Profile (Channel) Analytics

Period: Lifetime.

Post (Video) Analytics

Period: Lifetime.

Quirks

  • YouTube doesn’t distinguish between impressions and unique impressions at any level.
  • Dislikes are available through the API (though YouTube no longer shows dislike counts publicly). Handy if you want to know the truth.
  • Channel-level likes are not available. Video shares need raw analytics enabled. YouTube gives us a lot, but not everything.
  • Imported videos are always type: VIDEO. Shorts are flagged in the post’s extraData instead: { "contentType": "SHORTS", "isShort": true }, and their permalink uses https://www.youtube.com/shorts/<id>. contentType is YouTube’s creatorContentType (SHORTS, VIDEO_ON_DEMAND, LIVE_STREAM, …). If YouTube can’t tell us (no views yet, say), extraData is null and the link stays /watch. Re-running the import updates extraData and permalink on videos you already imported.

Raw Analytics - Demographics & Audience Data

YouTube raw analytics include demographics data when enabled for your organization. We query the YouTube Analytics API for each video and return age/gender breakdowns and country-level view counts. The same breakdown is also available for the whole channel in the profile raw analytics.
Raw analytics are gated per organization (rawYoutubeAnalyticsEnabled). If raw analytics are disabled for your org, the extended fields below (demographics, traffic sources, monetization, etc.) are not collected - only the standard metrics remain.

Monetization

Monetization (revenue) data is included in raw analytics only when both conditions are met:
  1. Raw analytics are enabled for your organization, and
  2. The account connected with business access - the YouTube monetary analytics scope, granted via withBusinessScope at connect time.
When both hold, monetization appears at two levels:
  • Channel-level - a channel-wide revenue report for the analytics window, stored in the profile raw analytics monetization field.
  • Video-level - a per-video revenue report, stored in each video’s monetization field.
Both use the YouTube Analytics API metrics: estimatedRevenue, estimatedAdRevenue, estimatedRedPartnerRevenue, grossRevenue, cpm, playbackBasedCpm, adImpressions, and monetizedPlaybacks.
A channel without monetization - not in the YouTube Partner Program (YPP), or the account never granted the monetary scope - returns the string "no data available" in the monetization field instead of a report. This is expected and never fails the analytics run.
Channel with monetization - the monetization field holds a report with columnHeaders and rows:
Channel without monetization - no YPP data or no monetary scope granted:

Channel Demographics

Profile raw analytics carry a channel-wide demographics field: viewer percentage by age group and gender, plus views by country (sorted by views, descending). It covers the last 365 days, so it’s a stable audience picture rather than a noisy 30-day slice. If YouTube returns nothing (or the call fails), the field is null and the rest of the run carries on.

Video-Level Raw Data

Empty demographics data is normal. YouTube has undocumented thresholds for when demographics become available. Unlike Instagram (~1,000 followers), nobody knows YouTube’s minimum. If demographics comes back empty or null for your videos, it likely means the account or video hasn’t hit the threshold yet. If you do see data, let us know your account stats - we’re trying to figure out the threshold too.
Raw YouTube data includes viewer percentage by age group and gender and views by country (sorted by view count, descending). This is useful for audience analysis and content strategy - especially if you’re targeting specific demographics or regions.
lifetimeTotals covers the video’s whole life (the window starts on or before the day before it went live, and runs until today). averageViewDuration is in seconds, averageViewPercentage is a percentage of the video length. contentType / isShort come from YouTube’s creatorContentType. Any of these is null when YouTube has no data for the video yet. The normalized shares metric is taken from lifetimeTotals.shares.
At the video level, the monetization field is null when the account has no business access (monetary scope was never granted), and "no data available" when the account has business access but the video has no monetary data (e.g. not in YPP). A populated report only appears when business access is granted and the video earned revenue in the window.