Skip to content

[FEAT] Expose containsSyntheticMedia, selfDeclaredMadeForKids, and other missing status fields on video insert/video update #182

@marcel10100

Description

@marcel10100

Summary

The YouTube Data API v3 videos.insert and videos.update endpoints expose several important fields on the status resource that yutu video insert and yutu video update currently don't wrap. This forces users to bypass yutu and call the YouTube API directly whenever they need to set any of these fields.

Would love to see them added as flags in a future release — especially containsSyntheticMedia, which is becoming mandatory for AI-generated content under YouTube's updated policy.

Missing fields

Field API location Why it matters
selfDeclaredMadeForKids status.selfDeclaredMadeForKids The real audience declaration (COPPA compliance). The existing --forKids flag maps to status.madeForKids which is a read-only computed field — setting it via the API doesn't actually work. Users want to set selfDeclaredMadeForKids and let YouTube derive madeForKids from it.
containsSyntheticMedia status.containsSyntheticMedia The Altered Content / AI-generated disclosure field (announced by YouTube March 2024). Mandatory for videos that use AI-generated voices, faces, or synthetic scenes. Not setting this when required is a policy violation.
recordingDate recordingDetails.recordingDate Lets creators set when the video was recorded (affects some sorting/filtering in Studio).
topicDetails.topicIds / topicCategories topicDetails.* Lets creators tag videos with YouTube's topic taxonomy (different from tags).

Current workaround (what users are doing)

Bypass yutu for these fields by calling the YouTube Data API directly. Minimum viable Python script using stdlib urllib:

import json, urllib.request, urllib.parse

# 1. Refresh OAuth access token using client_secret.json + youtube.token.json
# 2. GET /videos?id=VIDEO_ID&part=status
# 3. Modify status.containsSyntheticMedia = True (or whatever field)
# 4. PUT /videos?part=status with the updated resource

~80 lines. Works fine but defeats the point of having yutu.

Proposed CLI additions

# Insert
yutu video insert --file video.mp4 --title X --privacy public \\
  --selfDeclaredMadeForKids=false \\
  --containsSyntheticMedia=true \\
  --recordingDate=2026-04-10T12:00:00Z

# Update
yutu video update --id VIDEO_ID \\
  --containsSyntheticMedia=true

All boolean flags default to the YouTube API default (false / unset) to preserve backward compatibility.

Why this matters for AI creator tools

A growing share of YouTube content uses AI-generated voices (ElevenLabs), images (Midjourney, Gemini, Stable Diffusion), or full scenes (Veo, Kling, Sora). YouTube's Altered Content policy requires disclosing this at upload time. Any creator tool that uploads AI-generated content to YouTube NEEDS to be able to set containsSyntheticMedia — otherwise the creator is in policy violation.

Given yutu's positioning as "The AI-powered toolkit that grows your YouTube channel on autopilot", this feels like an important gap to close.

Offer to contribute

I'd be happy to open a PR adding --containsSyntheticMedia and --selfDeclaredMadeForKids flags to both video insert and video update if the maintainer agrees on the approach. Let me know if you'd prefer a single PR or separate ones per field.


Context: user shipping AI-generated Shorts to the Zero Tax Tags YouTube channel, discovered this gap while trying to disclose AI-generated yacht imagery in a marine-registration short.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions