YouTube selfDeclaredMadeForKids vs madeForKids: set it on upload
On videos.insert you set status.selfDeclaredMadeForKids; the API returns madeForKids. How the two differ, and one template for a batch of AI-made Shorts.

On a YouTube upload you set status.selfDeclaredMadeForKids to say whether a video is directed at children, and you read status.madeForKids to see the audience designation YouTube holds for it. For a batch of AI-made Shorts, put both audience and AI declarations in one upload template so no video is posted on defaults.
The field definitions come from the Videos resource and the videos.insert reference, read on 2026-10-02.
How do the two kids fields differ?
The Videos resource describes selfDeclaredMadeForKids as the property that lets the channel owner designate a video as child-directed during an upload or update. madeForKids is the current designation, which can be derived from that self-declaration. The insert reference lists selfDeclaredMadeForKids among the settable properties.
The page does not tell you what the right answer is for your content; that is your decision, and YouTube's own audience guidance applies. Sume does not make that call and does not set the field.
| Field | Direction | Meaning on the Videos resource page |
|---|---|---|
status.selfDeclaredMadeForKids | You set it | Designates the video as child-directed |
status.madeForKids | You read it | Current designation, potentially derived from your declaration |
status.containsSyntheticMedia | You set it | Discloses realistic altered or synthetic content such as deepfakes or altered real events |
Why put both in one template?
A batch is where defaults get inherited. If fifteen Shorts share one recipe, they usually share one audience answer and one synthetic-media answer, and you decide each once. Keep exceptions explicit: a single clip with a realistic synthetic person is a different answer from a stylized animation.
The synthetic-media field is described as disclosing realistic altered or synthetic content. For when it applies, read our post on the containsSyntheticMedia field and the platform disclosure checklist.
A template you can run
This builds the status object from per-video answers and refuses a missing audience answer, so a batch cannot post on an unanswered default. It runs as is.
def build_status(kids, synthetic, privacy="private"):
if kids is None:
raise ValueError("answer selfDeclaredMadeForKids for every video")
return {
"privacyStatus": privacy,
"selfDeclaredMadeForKids": bool(kids),
"containsSyntheticMedia": bool(synthetic),
}
batch = [
{"job": "job_a", "kids": False, "synthetic": True},
{"job": "job_b", "kids": False, "synthetic": False},
]
for v in batch:
print(v["job"], build_status(v["kids"], v["synthetic"]))What do I do when the two fields disagree?
The Videos resource says madeForKids is the current designation and may be derived from your self-declaration. If you read back a value you did not expect, treat the read-back as the source of truth about the video as YouTube holds it, and use your template to correct the declaration, not the other way round.
Do not infer from the field names that setting one controls the other in every case; the page only says the first can inform the second. For anything beyond that, rely on YouTube's own audience documentation, which we did not read for this post.
Where does Sume come in?
Sume produces the files. A Format bulk run can queue up to 100 runs, and each child's receipt lists what it made. Store the audience and synthetic answers beside each job id when you plan the batch, and read the receipt, not memory, when you upload.
Sume does not upload, label or classify your videos for YouTube. The jobs guide explains how to wait on each result without resubmitting a paid create.
Keep the template in version control and review it when YouTube changes its documentation. The revision history for 2026 lists changes to thumbnails, comments, quotas and view counting, but nothing to these two fields, so we are not aware of a change here. If that changes, the template is the one place to update, and the Sume jobs that made the files do not need to run again.
Sources
Related posts
More in Developers
- YouTube upload failureReason: codec, tooSmall, emptyFile
A failed YouTube upload reports one of six failureReason values. What each means and how to pre-check a clip with Sume video inspect before you upload.
- YouTube videos.batchGetStats: 1 quota unit to track your Shorts
videos.batchGetStats costs 1 quota unit and returns views, likes and comments for many videos. How to tie the numbers back to the Sume jobs that made them.
- YouTube videos.insert: 256 GB limit and containsSyntheticMedia
The YouTube Data API videos.insert method takes files up to 256 GB and a status.containsSyntheticMedia flag. A request body for an AI-made upload, with checks.
- YouTube API uploads stuck private: unverified project rule
Videos uploaded through videos.insert from an unverified API project created after 28 July 2020 are locked private. Test one upload before a Sume batch.
Written by Sume