YouTube

Long-form, Shorts, and the legal requirement of 'Made for Kids'.

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.

Text & Field Limits

FieldLimit
text (video title)Max 100 characters
descriptionMax 5,000 characters

Post Options

Send YouTube-specific options inside data.YOUTUBE.

FieldTypeDescription
typeenumVIDEO or SHORT. Default: SHORT.
uploadIdsstring[]Required. One uploaded video.
textstringVideo title. Max 100 characters.
descriptionstringVideo description. Max 5,000 characters.
thumbnailstringOptional thumbnail image URL uploaded through Bulkit.
privacyenumPRIVATE, PUBLIC, or UNLISTED. Default sent to YouTube is public if omitted.
madeForKidsbooleanRequired by YouTube policy. Set true when the video is made for children.
containsSyntheticMediabooleanSet true when the video contains AI-generated or synthetic content.
hasPaidProductPlacementbooleanSet true when the video contains paid product placement.
{
  "teamId": "team_123",
  "title": "YouTube launch video",
  "status": "SCHEDULED",
  "postDate": "2026-06-01T15:00:00.000Z",
  "socialAccountTypes": ["YOUTUBE"],
  "data": {
    "YOUTUBE": {
      "type": "VIDEO",
      "uploadIds": ["upload_video_123"],
      "text": "Product launch walkthrough",
      "description": "A full walkthrough of the new release.",
      "privacy": "PUBLIC",
      "madeForKids": false,
      "containsSyntheticMedia": false,
      "hasPaidProductPlacement": false
    }
  }
}

Analytics

YouTube analytics are all lifetime values. There is no rolling window — everything is cumulative from day one.

Profile (Channel) Analytics

Period: Lifetime.

MetricDescriptionNote
impressionsTotal channel views
impressionsUniqueSame as impressions (YouTube doesn't distinguish)
viewsTotal channel viewsSame as impressions
viewsUniqueSame as views
likesReturns 0 (not available at channel level)
commentsTotal commentsAcross all videos
postCountTotal videos
followersSubscribers
followingReturns 0 (not applicable to channels)

Post (Video) Analytics

Period: Lifetime.

MetricDescriptionNote
impressionsVideo views
impressionsUniqueSame as impressions (YouTube doesn't distinguish)
viewsVideo viewsSame as impressions
viewsUniqueSame as views
likesLikes
dislikesDislikesAvailable via API even though YouTube hides them on the UI
commentsComments
sharesReturns 0 (not provided by YouTube API)
savesFavorites

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. Post shares are not available. YouTube gives us a lot, but not everything.

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.

{
  "video": {
    "id": "dQw4w9WgXcQ",
    "snippet": {
      "title": "My Video",
      "publishedAt": "2026-01-15T10:00:00Z"
    },
    "statistics": {
      "viewCount": "125000",
      "likeCount": "8900",
      "commentCount": "342"
    }
  },
  "demographics": {
    "ageGender": {
      "columnHeaders": [
        { "name": "ageGroup", "columnType": "DIMENSION" },
        { "name": "gender", "columnType": "DIMENSION" },
        { "name": "viewerPercentage", "columnType": "METRIC" }
      ],
      "rows": [
        ["age18-24", "female", 12.3],
        ["age18-24", "male", 18.7],
        ["age25-34", "female", 14.1],
        ["age25-34", "male", 22.4],
        ["age35-44", "female", 8.2],
        ["age35-44", "male", 11.5]
      ]
    },
    "country": {
      "columnHeaders": [
        { "name": "country", "columnType": "DIMENSION" },
        { "name": "views", "columnType": "METRIC" }
      ],
      "rows": [
        ["US", 45200],
        ["GB", 12800],
        ["DE", 8900],
        ["BR", 7200]
      ]
    }
  }
}

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.

On this page